如何用CMake在VS同解决方案中管理库与应用的源码依赖
实现方案
1. 添加顶层CMake配置文件
在项目根目录/project下创建CMakeLists.txt,用来整合两个子项目并统一处理Conan依赖:
cmake_minimum_required(VERSION 3.15) # 定义合并项目名称 project(MyCombinedProject) # 引入Conan CMake工具(需提前将conan.cmake放入项目根目录或CMake二进制目录) include(conan.cmake) # 安装library的第三方依赖 conan_cmake_run(CONANFILE ${CMAKE_SOURCE_DIR}/library/conanfile.py BASIC_SETUP CMAKE_TARGETS BUILD missing) # 安装application的第三方依赖 conan_cmake_run(CONANFILE ${CMAKE_SOURCE_DIR}/application/conanfile.py BASIC_SETUP CMAKE_TARGETS BUILD missing) # 将library作为独立子项目引入,会在VS解决方案中生成对应项目 add_subdirectory(library) # 将application作为子项目引入 add_subdirectory(application)
2. 适配application的CMake配置(可开关切换开发/发布模式)
修改application/CMakeLists.txt,增加一个开关选项,开发阶段直接链接本地library项目,发布阶段切换为find_package调用:
cmake_minimum_required(VERSION 3.15) project(application) # 引入Conan工具处理自身依赖 include(${CMAKE_BINARY_DIR}/conan.cmake) conan_cmake_run(CONANFILE ${CMAKE_SOURCE_DIR}/conanfile.py BASIC_SETUP CMAKE_TARGETS BUILD missing) # 开发模式开关:开启时链接本地library项目,关闭时使用find_package option(USE_LOCAL_LIBRARY "Link against local library project" ON) # 添加应用程序源文件(保留你原有的配置) add_executable(application src/main.cpp) if(USE_LOCAL_LIBRARY) # 直接链接library项目的目标(需和library的CMakeLists中定义的目标名一致) target_link_libraries(application PRIVATE library) # 导入library的头文件目录(如果library未通过target_include_directories自动导出) target_include_directories(application PRIVATE ${CMAKE_SOURCE_DIR}/library/include) else() # 发布模式下使用find_package调用已安装的library find_package(library REQUIRED) target_link_libraries(application PRIVATE library::library) endif()
3. 生成Visual Studio解决方案
- 在项目根目录创建
build目录并进入 - 运行CMake命令生成解决方案(根据你的VS版本调整生成器参数):
cmake .. -G "Visual Studio 17 2022" -A x64
- 打开生成的
MyCombinedProject.sln,即可看到library和application两个独立项目。修改library源码后,构建application时会自动触发library的增量构建。
关键优势
- 两个子项目的原有
CMakeLists.txt无需大幅修改,仅application增加了一个开关逻辑 - 开发阶段无需反复通过Conan安装library,修改源码即可自动同步构建
- VS解决方案中两个项目独立,可单独调试或构建
内容的提问来源于stack exchange,提问作者Phoenix
相关产品推荐
相关产品推荐

