TL; DR我基本上想要这个问题的模块化解决方案。不仅有一个包含所有内容的解决方案,而且还为每个可执行文件提供了一个解决方案。
在这里的问题中,我想知道如何将CMakeLists.txt拆分到不同的文件夹中。一些文件夹包含将是静态库的代码,而某些代码将是在这些静态库上构建的可执行文件或动态库。
文件夹结构如下所示:
/path/to/base/
CMakeLists.txt
app1/
<src files for app1>
CMakeLists.txt
app2/
<src files for app2>
CMakeLists.txt
lib/
<src files for lib>
CMakeLists.txt
如果我采用在CMakeLists.txt
所有我的库和可执行文件都包含在父文件夹中的方法,并从包括所有目录的方法包含在我的目录中,那么我将遇到一个问题,当我生成VS项目/解决方案时,我的每个目标的项目都包含所有项目-不仅实现我预期目标所必需的。
目录CMakeLists.txt
中的基本文件夹:
cmake_minimum_required(VERSION 3.1)
add_subdirectory(lib)
add_subdirectory(app1)
add_subdirectory(app2)
和CMakeLists.txt
app1文件夹中的(app2等效)
cmake_minimum_required(VERSION 3.1)
project(app1)
add_executable(app1 <src of app1>)
target_link_libraries(app1 lib)
和CMakeLists.txt
lib:
add_library(lib <src of lib>)
如果我在CMakeLists.txt
from基础上运行cmake,则解决方案将包含所有项目。即使我只打开其中一个项目,它还包含所有内容。app1的VS项目也可以构建app2-我不想要。
如果仅在CMakeLists.txt
app1的cmake上运行cmake,则会得到一个不包含app2但也不包含lib的解决方案,因为仅在cmake文件内部进行链接而不是作为目标(在基本文件中)进行链接
CMake将为每个对的调用创建一个解决方案project
,然后将包括当前目录及其子目录的所有目标(无论它们是在实际调用之前还是之后定义的project
)。
行为良好的CMake脚本应该执行以下操作:您希望能够在较大项目中充当其自己的子树的根的每个CMakeLists应该从cmake_minimum_required
调用开始,然后是project
调用。编写project
CMakeLists基本上意味着:这是一个完全独立的组件,即使您从其父目录中删除了所有文件,也可以独立构建。这样,对于每个这样的问题都有一个单独的解决方案是有意义的project
。
考虑到这一点,我们可以看到为什么这种情况对您不起作用:您的应用程序不是完全独立的,它们依赖lib。解决方案是编写应用程序的构建脚本,就好像lib是作为第三方组件提供的一样,包含find_package
调用和所有内容。在复合版本中,您已经有lib的目标,因此find_package
应使调用调用的脚本与使用该目标短路,并且只有在找不到该目标时才进行清理。
还请阅读CMake的包装系统的工作原理,该系统提供了一些自动化功能,可以非常优雅地处理此类情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句