【发布时间】:2021-07-08 02:10:44
【问题描述】:
我是 CMake 新手,当我在 cmake 之后运行 make 时,我的代码没有正确链接。
如果我使用 apple clang 的默认编译器,则代码根本无法编译,因此我将 CMakeLists.txt 文件中的编译器更改为使用 g++ 而不是 AppleClang,使用这些行:
###########################
# CMake Build Environment #
###########################
#
# You can set the following Environment variables:
#
# CMAKE_MODULE_PATH to the search path for cmake modules (e.g., SFML.cmake)
# CMAKE_BUILD_TYPE to override the default build type. Valid options are 'release', 'profile' and 'debug'
#
#########################################
set(CMAKE_C_COMPILER "gcc-10")
set(CMAKE_CXX_COMPILER "g++-10")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
#set(CMAKE_CXX_STANDARD 11)
它应该使用 C++11,但我不确定它是否这样做。当我取消注释 CMAKE 标志时,它仍然给出相同的错误。
当我运行 make 时:
[ 91%] Built target Bird_core
Scanning dependencies of target bird
[ 95%] Building CXX object CMakeFiles/bird.dir/bin/bird.cpp.o
[100%] Linking CXX executable bird
Undefined symbols for architecture x86_64:
"__ZN2sf4Font12loadFromFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", referenced from:
__ZN13ResourceCache16loadFontResourceERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_ in libBird_core.a(ResourceCache.cpp.o)
"__ZN2sf6StringC1EPKcRKSt6locale", referenced from:
__ZN9__gnu_cxx13new_allocatorIN2sf12RenderWindowEE9constructIS2_JNS1_9VideoModeERA11_KcNS1_5Style9._anon_74ERNS1_15ContextSettingsEEEEvPT_DpOT0_ in libBird_core.a(Game.cpp.o)
"__ZN2sf6StringC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6locale", referenced from:
__ZN19PlayingMenuActivity6updateERKf in libBird_core.a(PlayingMenuActivity.cpp.o)
__ZN6Button9setStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE in libBird_core.a(Button.cpp.o)
"__ZN2sf7Texture12loadFromFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_4RectIiEE", referenced from:
__ZN13ResourceCache19loadTextureResourceERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_ in libBird_core.a(ResourceCache.cpp.o)
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make[2]: *** [bird] Error 1
make[1]: *** [CMakeFiles/bird.dir/all] Error 2
代码应该不是问题(它适用于 Linux/Windows,我将编译器从 Apple clang 更改为 g++)。触发此事件的代码部分只是来自库 SFML 的 font.loadFromFile() 和 texture.loadFromFile()。我认为这与我如何链接 SFML 或其他东西有关。
感谢您的帮助,谢谢!
【问题讨论】:
-
你能显示产生错误的代码吗?
-
Debug % cmake ..Debug % make -
那不是 C++ 代码。显示产生这个特定问题的 C++ 代码,至少是你认为的那一行。
-
显示。这。 C++。代码。请。也许 GCC 对此感到满意,而 clang 则不满意。
-
请edit您的问题包含带有完整源代码的minimal reproducible example,编译器命令行或cmake文件以及完整的错误消息