我正在尝试为平台编写CMakeLists.txt。该平台有多个项目,共享一些库并拥有自己的可执行文件。我希望能够构建整个项目,以及项目内的各个可执行文件。
out-of-source root build可以正常工作:
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
调用add_subdirectory(../lib libs)
。
这允许可执行文件链接到root/lib
子目录中定义的任何目标。如果我然后尝试独立于项目构建可执行文件,CMake将无法找到可执行文件需要链接的目标。是否有一个优雅的解决方案/模式,允许这个?我想到的一种方法是从ui / CMakeLists.txt中只用add_subdirectory(../../ root)
,使用类似标题保护的东西来阻止无限的add_subdirectory循环。
答案 0 :(得分:0)
使用make executable1
(例如)构建单个目标。