使用CMake构建含库项目时遇编译错误:无法找到指定库
问题:CMake构建可执行文件时无法找到静态库
我正尝试创建一个包含两个目标的CMake项目:一个静态库和一个可执行文件。但构建可执行文件时,出现了无法找到该库的错误。
库的CMake配置(arcade-games-lib/CMakeLists.txt)
file(GLOB SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/*.cpp) set(HEADERS include) add_library(arcade-lib STATIC ${SOURCES}) target_include_directories(arcade-lib PUBLIC ${HEADERS}) target_link_libraries(arcade-lib PRIVATE sfml-window sfml-graphics)
可执行文件的CMake配置(snake-game/CMakeLists.txt)
file(GLOB SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/*.cpp) set(INCLUDE include) set(ARCADE_GAMES_LIB_INCLUDE ../arcade-games-lib/include) add_executable(snake-game snake-game.cpp ${SOURCES}) target_link_libraries(snake-game PRIVATE arcade-games-lib sfml-graphics sfml-window sfml-system sfml-main ) target_include_directories(snake-game PRIVATE ${INCLUDE} ${ARCADE_GAMES_LIB_INCLUDE})
主CMake配置(CMakeLists.txt)
cmake_minimum_required(VERSION 3.25) project(arcade_games) set(CMAKE_CXX_STANDARD 20) set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc") set(SFML_STATIC_LIBRARIES TRUE) find_package(SFML 2.5 COMPONENTS graphics window system REQUIRED) add_subdirectory(arcade-games-lib) add_subdirectory(snake-game)
错误信息
C:\Program Files\JetBrains\CLion 2022.3.2\bin\mingw\bin/ld.exe: cannot find -larcade-games-lib collect2.exe: error: ld returned 1 exit status ninja: build stopped: subcommand failed.
我完全不知道该如何解决,因为所有配置看起来都是正确的。我期望能构建出包含该库的可执行文件。
解决方案
核心问题是库名称不匹配:
- 库的CMake配置中,你创建的静态库目标名称是
arcade-lib(通过add_library(arcade-lib STATIC ${SOURCES})定义) - 但在可执行文件的配置里,你尝试链接的库名称是
arcade-games-lib,和实际生成的库目标名不一致,导致链接器找不到对应文件。
修复步骤:
- 修改可执行文件的CMake配置,把
target_link_libraries中的库名称改为arcade-lib:
target_link_libraries(snake-game PRIVATE arcade-lib sfml-graphics sfml-window sfml-system sfml-main )
- 移除手动设置的
ARCADE_GAMES_LIB_INCLUDE变量及对应包含目录配置——因为库的target_include_directories已经设为PUBLIC,CMake会自动将库的包含目录传递给链接它的目标,无需手动添加。修改后的可执行文件CMake配置如下:
file(GLOB SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/*.cpp) set(INCLUDE include) add_executable(snake-game snake-game.cpp ${SOURCES}) target_link_libraries(snake-game PRIVATE arcade-lib sfml-graphics sfml-window sfml-system sfml-main ) target_include_directories(snake-game PRIVATE ${INCLUDE})
- 重新生成构建文件并执行构建即可解决问题。
内容的提问来源于stack exchange,提问作者Vinograd
相关产品推荐
相关产品推荐

