You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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,和实际生成的库目标名不一致,导致链接器找不到对应文件。

修复步骤:

  1. 修改可执行文件的CMake配置,把target_link_libraries中的库名称改为arcade-lib:
target_link_libraries(snake-game PRIVATE arcade-lib sfml-graphics sfml-window sfml-system sfml-main )
  1. 移除手动设置的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})
  1. 重新生成构建文件并执行构建即可解决问题。

内容的提问来源于stack exchange,提问作者Vinograd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 04:21:23