我的项目包含多个共享一些通用代码的可执行文件。我想将通用代码放在可执行文件可以链接到的静态库中。 (公共代码非常小,我不喜欢处理共享库)。
源树看起来像这样:
- project
- CMakeLists.txt
- common
- CMakeLists.txt
- src
- include
- app1
- app2
app1 和 app2 都依赖于共同的代码。
这个通用代码是非常特定于应用程序的,并且永远不需要被该目录树之外的另一个项目使用。出于这个原因,我不想将该库安装在任何类型的全球位置。
顶级 CMakeLists.txt 文件仅添加子目录:
project(toplevel)
cmake_minimum_required(VERSION 3.1)
add_subdirectory(common)
add_subdirectory(app1)
add_subdirectory(app2)
公共库的 CMakeLists.txt 文件创建静态库并设置包含目录:
add_library(common STATIC common.cpp)
target_include_directories(common PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include")
可执行文件的文件如下所示:
project(app1)
cmake_minimum_required(VERSION 3.1)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} common)
现在我的问题。如果我从顶级项目目录运行 CMake,我可以构建 app1 和 app2 并且它们构建成功。但是,如果我想构建其中一个项目(例如,通过从 app1 运行 CMake)而不是从顶级目录构建,则会收到错误消息,因为common/include
未添加到标头搜索路径中。
我明白为什么会发生这种情况。 app1 或 app2 的 CMakeLists.txt 文件中没有任何“拉入”共同点。这仅在顶层完成。
有没有办法解决这个问题,或者这种行为通常被认为是可以接受的?我的设置是否欠佳?我只是想,如果我们开始开发越来越多使用这个通用库的可执行文件,能够单独构建项目而不是从顶层构建项目会很好,但也许这是我不应该做的事情关心。