我有一个CMakeLists.txt文件,我用它来构建一个测试可执行文件和一个共享库.它们都依赖于另一个库(SFML).
我在MinGW的窗口上使用cmake.
我知道我正在构建的lib的名称与sfml有点混淆,但它应该是一个SFML包装器,所以,我找不到更好的名字!
这里是CMakeLists.txt
cmake_minimum_required(VERSION 2.6) project(projectName) set(EXECUTABLE_NAME testSFML) set(LIBRARY_NAME SFMLwindow) set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin/) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include / ${CMAKE_CURRENT_SOURCE_DIR}/../../include ) link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../lib/) file( GLOB_RECURSE SRC_FILES src/* ) file( GLOB_RECURSE INCLUDE_FILES include/* ) add_executable( ${EXECUTABLE_NAME} main.cpp ${SRC_FILES} ${INCLUDE_FILES} ) target_link_libraries( ${EXECUTABLE_NAME} sfml-main sfml-system sfml-window ) add_library( ${LIBRARY_NAME} SHARED ${SRC_FILES} )
我在终端得到了什么:
"C:\MinGW\bin\mingw32-make.exe" -- Configuring done -- Generating done -- Build files have been written to: C:/Users/iksemel/docs/WorkBench/programming/projets/TestSFML/cmake Linking CXX shared library libSFMLwindow.dll Creating library file: libSFMLwindow.dll.a CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x59):undefined reference to `_imp___ZN2sf9VideoModeC1Ejjj' CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0xda): undefined reference to `_imp___ZN2sf6WindowC1ENS_9VideoModeERKSsjRKNS_15ContextSettingsE' CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x163): undefined reference to `_imp___ZN2sf6Window5closeEv' CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x1bd): undefined reference to `_imp___ZN2sf6Window9pollEventERNS_5EventE' CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x1d8): undefined reference to `_imp___ZN2sf6Window7displayEv' collect2: ld a retourné 1 code d'état d'exécution mingw32-make.exe[2]: *** [libSFMLwindow.dll] Error 1 mingw32-make.exe[1]: *** [CMakeFiles/SFMLwindow.dir/all] Error 2 mingw32-make.exe: *** [all] Error 2
如果有人知道发生了什么,我会非常感激!
解决方法
您可以尝试将CMakeLists.txt的结尾更改为:
add_library( ${LIBRARY_NAME} SHARED ${SRC_FILES} ${INCLUDE_FILES} ) add_executable( ${EXECUTABLE_NAME} main.cpp ) target_link_libraries( ${LIBRARY_NAME} sfml-main sfml-system sfml-window ) target_link_libraries( ${EXECUTABLE_NAME} ${LIBRARY_NAME} )
顺便说一下,文件(GLOB_RECURSE …通常不赞成收集源列表的方法.来自file
的文档:
We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed then the generated build system cannot know when to ask CMake to regenerate.
此外,在这种情况下,find_library
应优先于link_directories
.来自link_directories的文档:
Note that this command is rarely necessary. Library locations returned by find_package() and find_library() are absolute paths. Pass these absolute library file paths directly to the target_link_libraries() command. CMake will ensure the linker finds them.