[英]Undefined reference to std::bad_cast::bad_cast()
我在Linux上使用cake和clang ++。 我遇到了一些鏈接器問題:
Linking CXX executable "/run/media/toi/Storage E/Dropbox/Programmering/Flictus/bin/main"
CMakeFiles/main.dir/GraphicsEngine/Shader.cpp.o:/run/media/toi/Storage E/Dropbox/Programmering/Flictus/src/GraphicsEngine/Shader.cpp:function std::__1::basic_filebuf<char, std::__1::char_traits<char> >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int): error: undefined reference to 'std::bad_cast::bad_cast()'
CMakeFiles/main.dir/GraphicsEngine/Shader.cpp.o:/run/media/toi/Storage E/Dropbox/Programmering/Flictus/src/GraphicsEngine/Shader.cpp:function std::__1::basic_filebuf<char, std::__1::char_traits<char> >::sync(): error: undefined reference to 'std::bad_cast::bad_cast()'
CMakeFiles/main.dir/GraphicsEngine/Shader.cpp.o:/run/media/toi/Storage E/Dropbox/Programmering/Flictus/src/GraphicsEngine/Shader.cpp:function std::__1::basic_filebuf<char, std::__1::char_traits<char> >::underflow(): error: undefined reference to 'std::bad_cast::bad_cast()'
CMakeFiles/main.dir/GraphicsEngine/Shader.cpp.o:/run/media/toi/Storage E/Dropbox/Programmering/Flictus/src/GraphicsEngine/Shader.cpp:function std::__1::basic_filebuf<char, std::__1::char_traits<char> >::overflow(int): error: undefined reference to 'std::bad_cast::bad_cast()'
我假設這確實是一個鏈接器問題,因為它是在鏈接開始並包含相關標頭之后發生的。
我沒有在std::cout
等上得到未定義的引用。
生成鏈接器錯誤的代碼:
std::ifstream file(shaderFile, std::ios::in | std::ios::binary);
if (file) {
file.seekg(0, std::ios::end);
shaderString.resize(file.tellg());
file.seekg(0, std::ios::beg);
file.read(&shaderString[0], shaderString.size());
file.close();
}
在添加上述代碼之前,項目運行良好。 它可以在Visual Studio 2013中正常運行。
cmake文件的相關部分:
add_compile_options(-stdlib=libc++)
add_compile_options(-std=c++1y)
set(CMAKE_LINKER /usr/bin/clang++) # didn't help when added
set(CMAKE_EXE_LINKER_FLAGS "-lc++ -Wall -fexceptions")
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
set(CMAKE_C_COMPILER /usr/bin/clang)
那么,還有更多我應該鏈接的東西嗎?還是clang ++中的限制?
編輯:鏈接器調用:
"/usr/bin/ld.gold" -export-dynamic --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o
/run/media/toi/Storage E/Dropbox/Programmering/Flictus/bin/main /usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../lib64/crt1.o /usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../lib64/crti.o
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/crtbegin.o -L/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.8.2 -L/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../.. -L/lib
-L/usr/lib CMakeFiles/main.dir/main.cpp.o CMakeFiles/main.dir/GraphicsEngine/GraphicsEngine.cpp.o CMakeFiles/main.dir/GraphicsEngine/Shader.cpp.o
CMakeFiles/main.dir/GraphicsEngine/TextureLoader.cpp.o CMakeFiles/main.dir/Input/Gamepad.cpp.o CMakeFiles/main.dir/Input/Input.cpp.o CMakeFiles/main.dir/GUI/Font.cpp.o CMakeFiles/main.dir/GUI/GUIEngine.cpp.o
CMakeFiles/main.dir/GUI/GUIRect.cpp.o CMakeFiles/main.dir/GUI/GUISprite.cpp.o CMakeFiles/main.dir/GUI/Objects/Components/GUIText.cpp.o CMakeFiles/main.dir/GUI/Objects/GUIButton.cpp.o
CMakeFiles/main.dir/GUI/Objects/GUIImage.cpp.o CMakeFiles/main.dir/GUI/Objects/GUILabel.cpp.o CMakeFiles/main.dir/GUI/Objects/GUIListBox.cpp.o
CMakeFiles/main.dir/GUI/Objects/GUIObject.cpp.o -lSDL2 -lpthread -lGLEW -lGL -lSOIL -lc++ -lfreetype -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/crtend.o /usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../lib64/crtn.o
這是通過與libc++abi
鏈接解決的。
如果尚未這樣做,請嘗試使用前綴g ++而不是gcc EX編譯代碼:
g++ (file name) : gcc (file name)
第一個是正確的。
這樣做的原因是因為使用g ++前綴允許運行不同的代碼庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.