CMake编译可执行文件同时生成可链接静态库的方案问询
第一步:修改first目录的CMakeLists.txt
这个配置会同时生成你需要的不含main的静态库文件,以及原有测试用的可执行程序:
cmake_minimum_required(VERSION 3.7) project(testproject) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED True) # 查找SDL依赖 find_package(SDL2 REQUIRED) # 将公共代码编译为静态库(单个.a文件,不含main代码) add_library(first_static STATIC first.cpp first.h ) # 配置静态库的头文件路径和依赖,后续链接该库的目标会自动继承这些配置 target_include_directories(first_static PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${SDL2_INCLUDE_DIRS} ) target_link_libraries(first_static PUBLIC ${SDL2_LIBRARIES} ) # 原有测试用可执行程序,仅编译main.cpp并链接上面的静态库 add_executable(first_exec main.cpp ) target_link_libraries(first_exec PRIVATE first_static )
编译完成后,你会在first/build目录下看到生成的libfirst_static.a文件,这就是你需要的单个可链接目标文件。
第二步:配置second目录的CMakeLists.txt
假设你的second目录结构如下:
second/ main.cpp CMakeLists.txt
对应CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.7) project(second_project) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED True) # 查找SDL依赖,和first项目保持版本一致 find_package(SDL2 REQUIRED) # 生成第二个组件的可执行文件 add_executable(second_exec main.cpp ) # 指定first项目的头文件搜索路径,替换为你实际的first目录路径 target_include_directories(second_exec PRIVATE /absolute/or/relative/path/to/first/ ) # 链接first项目生成的静态库,替换为你实际的libfirst_static.a路径 target_link_libraries(second_exec PRIVATE /absolute/or/relative/path/to/first/build/libfirst_static.a ${SDL2_LIBRARIES} )
构建流程说明
- 先进入
first/build目录执行cmake .. && make,完成静态库和测试可执行文件的编译 - 再进入second的build目录执行
cmake .. && make,即可完成第二个组件的编译,不需要重复编译first的公共代码
注意事项:两个项目的C++标准、编译选项、SDL版本需要保持一致,避免出现链接错误。如果修改了first的公共代码,只需要重新编译first的静态库,再重新编译second即可,增量编译效率远高于重复编译源码。
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

