簡體   English   中英

共享庫文件中的未定義符號

[英]Undefined symbol in shared object file

我使用以下代碼編譯了代碼:

gcc -c -O3 -fPIC -fno-rtti -fno-implicit-templates -Wno-deprecated -I. -I/rw/include/ Exotic.C -o RBCExotic.o

當我嘗試使用'RBCExotic.o'文件時,出現以下錯誤。

loading error /home/rw/rw_lib/Exotics.so: undefined symbol: _ZN5ArrayIPKvE4sizeEibbb

當我使用nm分解代碼時,給我一個錯誤的行是這樣的:

U Array<void const*>::size(int, bool, bool, bool)

但是,此“大小”功能是在“ / rw / include /”內的頭文件中定義和實現的,如下所示:

template <class T>
int
Array<T>::size(int n, bool reduceMem, bool copyData, bool delData)
{
    return _size(n, reduceMem, copyData, delData);
}

並且在其下方也定義了“ _size”。

我是否錯誤地編譯了此代碼? 還有其他可能的問題,這可能是某種紅色的鯡魚嗎?

-fno-implicit-templates意思是“不要實例化我使用的模板,我將通過提供顯式實例化來手動進行。”

因此,您不得不對編譯器撒謊。 您告訴它不要為了提供必需的符號而實例化Array<T>::size函數模板,因此它按照您的要求進行了操作,但並沒有討價還價。

最好的解決方案是停止使用該選項,並讓編譯器自動執行“正確操作”。 當您使用Array<void const*>::size(int, bool, bool, bool) ,它將在頭文件中實例化泛型定義並提供缺少的符號。

有關更多信息,請參見GCC手冊 ,盡管該頁面已經過時,並且應該忽略-frepo是最佳選擇。 最好的選擇是第三個。

如果確實要使用該選項,則需要為所使用的每個模板提供一個顯式實例化(這是GCC文檔中的第二個選項)。 .C文件(不是標頭)中,定義Array<void const*>的顯式實例,如下所示:

template class Array<void const*>;

或針對單個功能:

template int Array<void const*>::size(int, bool, bool, bool);

我看到您包括頭文件(-I)。 那是Mac嗎? 我不認路。 也許這可以幫助您:

clang ++ -stdlib = libc ++導致未定義的引用

我看過

g++ -std=c++11 your_file.cpp -o your_program -I(as necessary)

在其他地方使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM