[英]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.