【发布时间】:2016-01-31 07:15:44
【问题描述】:
我的项目包含几个共享一些通用代码的可执行文件。我想将通用代码放在可执行文件可以链接到的静态库中。 (通用代码很小,我不想处理共享库)。
源代码树看起来像这样:
- 项目
- CMakeLists.txt
- 常见
- CMakeLists.txt
- 源代码
- 包括
- 应用程序1
- 源代码
- CMakeLists.txt
- 应用程序2
- 源代码
- CMakeLists.txt
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 文件中没有任何“引入”常见的内容。这仅在顶层完成。
有没有办法解决这个问题,或者这种行为通常被认为是可以接受的?我的设置不是最理想的吗?我只是想,如果我们开始开发越来越多使用这个公共库的可执行文件,那么能够单独构建项目而不是从顶层构建项目会很好,但也许这是我不应该做的事情担心。
【问题讨论】:
-
你真的需要
project(app1)吗?您可以在顶级构建目录中执行make app1以仅编译 app1 及其依赖项。 -
我的一个项目中遇到了类似的问题,除了我没有顶级
CMakeLists.txt:见CMake: How to setup Source, Library and CMakeLists.txt dependencies?。我想在那里覆盖add_subdirectory()。但是@m.s.向我指出了一个非常有趣的系列文章Use CMake-enabled libraries in your CMake project。主要是告诉export()通用库,所以你可以通过 CMake 代码 sn-p 导入它。 -
@arrowd 我不确定。也许答案是我不知道。我不太明白什么时候子目录应该是它自己的项目。
标签: cmake