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

使用CMake实现类Visual Studio的带依赖静态库生成方案

CMake静态库依赖传递问题:生成可直接复用的Fat Static Library

问题场景

作为CMake新手,我尝试构建一个可在多个应用中复用的静态库MyLibrary,配置了PUBLIC依赖链接,但生成的.lib文件在被MyApplication引用时出现unresolved external symbol错误——GLFW、GLEW等第三方依赖并未自动传递到下游项目。

对比Visual Studio手动创建的静态库:只需在项目属性的「链接器>附加依赖项」中添加第三方库,生成的.vcxproj会包含<AdditionalDependencies>节点,下游项目直接引用.lib即可,无需额外配置依赖。但CMake默认生成的.vcxproj缺少该节点,静态库体积更小,但依赖完全不传递,必须在下游项目重复配置链接规则才能解决问题。

原CMake配置

cmake_minimum_required(VERSION 3.10)

# Set the project name
project(MyLibrary)

# Specify the C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(BUILD_MODE "x64" CACHE STRING "Build mode: x64 or Win32")

# Collect all source files, including MyLibrary and GUI implementations
file(GLOB_RECURSE GUI_SOURCES src/GUI/*.cpp)
set(SOURCES
    src/MyLibrary.cpp
    ${GUI_SOURCES} # Add collected GUI sources
)

# Define the library target
add_library(MyLibrary STATIC ${SOURCES})

# Link the third-party libraries (PUBLIC to propagate)
target_link_libraries(MyLibrary PUBLIC 
    ${CMAKE_SOURCE_DIR}/ThirdParty/GLFW/lib/${BUILD_MODE}/glfw3.lib
    ${CMAKE_SOURCE_DIR}/ThirdParty/GLEW/lib/${BUILD_MODE}/glew32s.lib
    opengl32.lib
)

# Include directories for public headers
target_include_directories(MyLibrary PUBLIC
    ${PROJECT_SOURCE_DIR}/include
    ${PROJECT_SOURCE_DIR}/include/GUI # Add GUI include folder
)

# Include directories for third-party libraries
target_include_directories(MyLibrary PUBLIC
    ${CMAKE_SOURCE_DIR}/ThirdParty/GLFW/include
    ${CMAKE_SOURCE_DIR}/ThirdParty/GLEW/include
    ${CMAKE_SOURCE_DIR}/ThirdParty/GLM
)

构建命令:

cmake -S . -B build 
cmake --build .\build\

解决方案

通过修改CMAKE_STATIC_LINKER_FLAGS,让CMake将第三方依赖库的符号合并到目标静态库中,生成Fat Static Library,实现和Visual Studio手动配置相同的效果:

set ( 
    CMAKE_STATIC_LINKER_FLAGS 
    "${CMAKE_STATIC_LINKER_FLAGS}
     ${CMAKE_SOURCE_DIR}/ThirdParty/GLEW/lib/${BUILD_MODE}/glew32s.lib
     ${CMAKE_SOURCE_DIR}/ThirdParty/GLFW/lib/${BUILD_MODE}/glfw3.lib
     opengl32.lib" 
)

效果说明

添加该配置后,CMake生成的静态库会包含所有依赖库的符号信息,下游项目只需直接引用MyLibrary.lib即可,无需再手动配置GLFW、GLEW等依赖的链接规则,彻底解决unresolved external symbol错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 15:00:06