如何使用CMake生成单一大体积.o对象库文件而非STATIC .a静态库
解决方案
CMake 内置的 OBJECT 库类型只会生成每个源文件对应的独立 .o 文件,不会自动合并为单个大体积目标文件,你需要手动调用链接器的可重定位链接功能实现需求,Linux 下使用 ld -r 即可完成合并。
正确配置示例
# 1. 定义源文件列表,注意变量名不要加$符号 set(SOURCE_FILES src/file1.cpp src/file2.cpp ... ) # 2. 编译所有源文件为独立目标文件,方便后续统一获取路径 add_library(myLib_objects OBJECT ${SOURCE_FILES}) target_link_libraries(myLib_objects PRIVATE ${LIBS_THAT_REQUIRED}) # 3. 配置合并单个.o文件的规则 set(MERGED_O_PATH ${CMAKE_CURRENT_BINARY_DIR}/myLib.o) add_custom_command( OUTPUT ${MERGED_O_PATH} COMMAND ${CMAKE_LINKER} -r $<TARGET_OBJECTS:myLib_objects> -o ${MERGED_O_PATH} DEPENDS myLib_objects COMMENT "Merging object files into single myLib.o" ) # 将合并操作加入默认构建目标 add_custom_target(generate_merged_o ALL DEPENDS ${MERGED_O_PATH}) # 4. 生成你需要的静态库 add_library(FinalLibrary STATIC $<TARGET_OBJECTS:myLib_objects>) target_link_libraries(FinalLibrary PRIVATE ${LIBS_THAT_REQUIRED})
补充说明
- 用
${CMAKE_LINKER}替代硬编码的ld可以自动适配CMake检测到的链接器,交叉编译场景下也能正常工作 - 如果是C/C++混合编译的场景,可将链接命令替换为
${CMAKE_CXX_COMPILER} -nostdlib -r,避免标准库符号匹配异常 - 生成的
myLib.o默认输出到当前模块的构建目录下,你可以修改MERGED_O_PATH变量自定义输出路径
内容的提问来源于stack exchange,提问作者pureofpure
相关产品推荐
相关产品推荐

