如何使用CMake处理依赖关系



我正试图将我以前的qmake方法转换为cmake。我有一个称为shared的静态库,它将不同的应用程序链接为一个共同点。每个应用程序都有自己的静态库common,用于链接同一应用程序的不同目标(standalone, plugin-format-1, plugin-format-2等)。

shared/
├── CMakeLists.txt
├── shared.cmake
│   .
project/
├── CMakeLists.txt
├── common/
├── common/CMakeLists.txt
│   common/common.cmake
│   .

当我在开发和调试时,我想避免单独编译每个库的麻烦,所以在调试模式下,我通常会包含shared。Pri和common。在编译应用程序时,所有内容都将顺利编译。我试图复制这个包含模式使用。cmake文件。

#project.pro
include(../shared/shared.pri)
include(common/common.pri)

当我想制作应用程序的最终版本和发布版本时,我有一个编译共享静态库的构建脚本,公共静态库,然后用这个库链接不同的目标。

我已经为共享和公共静态库创建了CMakeLists.txt。我现在的问题是如何用cmake复制上面描述的模式,因为当包含共享的。c和common。在应用程序CMakeLists.txt中,路径不兼容。似乎当您包含(xxx.cmake)时,路径将始终相对于父CMakeLists.txt。

用CMake实现这个目标的正确方法是什么?这可能吗?

使用add_subdirectory()代替include。对于shared,它是"out-of-tree",您还需要指定二进制目录(存放生成和编译的文件的地方)。

add_subdirectory(../shared shared)
add_subdirectory(common)

在这些子项目中创建的任何目标现在都可以与主项目中的target_link_libraries链接。

当您构建单独的版本时,请考虑使用export()和/或install(EXPORT)来生成可以从应用程序项目中包含的cmake文件,而不是使用add_subdirectory(),因此这可能是您需要做的唯一更改。

最新更新