使用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
相关产品推荐
相关产品推荐

