我正在尝试为平台编写CMakeLists.txt。该平台有多个项目,这些项目共享一些库并具有自己的可执行文件。我希望能够将每个项目作为一个整体构建,以及项目中的单个可执行文件。
源外根构建工作正常:
mkdir root-build && cd root-build && cmake ../root
源外可执行版本不起作用:
mkdir ui-build && cd ui-build && cmake ../root/project1/ui
我目前的目录结构如下:
root/
+-- CMakeListst.txt
+-- lib/
+-- CMakeLists.txt
+-- sharedLib1/
+-- CMakeLists.txt
+-- sharedLIb2/
+-- CMakeLists.txt
+-- project1/
+-- CMakeLists.txt
+-- ui/
+-- CMakeLists.txt
+-- executable1/
+-- CMakeLists.txt
+-- shared/
+-- CMakeLists.txt
+-- project2/
+-- CMakeLists.txt
+-- executable/
+-- CMakeLists.txt
我当前的项目结构将所有目标和库构建为项目的一部分,但是我不知道如何单独构建可执行文件。
项目的主要 cmake 文件是root/project*/CMakeLists.txt
。此文件INCLUDES
root/CMakeLists.txt
,它执行一些所有项目通用的设置(例如,为第三方库设置CMAKE_MODULE_PATH
和find_package
)。项目 cmake 文件还为其中的每个可执行文件和add_subdirectory(../lib libs)
调用add_subdirectory
。
这允许可执行文件链接到root/lib
子目录中定义的任何目标。如果我随后尝试独立于项目构建可执行文件,CMake 将无法找到可执行文件需要链接的目标。有没有一个优雅的解决方案/模式可以允许这样做?我想到的一种方法是从 ui/CMakeLists.txt 中add_subdirectory(../../ root)
,使用类似于标头保护的东西来防止无限add_subdirectory循环。
例如,使用make executable1
来构建单个目标。