我认为这很简单,没有人愿意把它写下来,但我无法弄清楚。让我们考虑一个微不足道的例子。
ProjectTree
|- CMakeLists.txt
|- Library1
| |- CMakeLists.txt
| |- src
| |- include
|- Library2 # depends on Library1
| |- CMakeLists.txt
| |- src
| |- include
|- Program1 # depends on Library2 (not directly on Library1)
| |- CMakeLists.txt
| |- src
|- Program2 # depends on Library2 (not directly on Library1)
| |- CMakeLists.txt
|- src
如何使用CMake 3进行更大规模的构建(我们有大约20个库)?我需要请求构建Program1并更新Program1,Library1和Library2,因为它们相互依赖。然后请求构建Program2,而不是再次编译Library1和Library2。此外,当我在Library1中更改某些内容时,所有依赖目标都应该检测它。
答案 0 :(得分:3)
在Library2 / CMakeLists.txt中使用target_link_libraries(Library2 Library1)
,然后在Program1 / CMakeLists.txt中使用target_link_libraries(Program1 Library2)
。由于您对Library2所描述的依赖性,库1将自动链接到Program1。您可能还需要使用target_include_directories
(请参阅文档页面底部的示例)来描述包含目录的每个库,这些目录应该是"导出的"即添加到使用特定库的代码的include目录中,而不是库本身。
您可能还会在target_link_libraries
页面底部找到有用的示例,其中描述了Library1和Library2相互依赖的情况,并且(大多数流行的)链接器要求其中一个库被指定两次在link命令中,第一次在另一个库之前,第二次在另一个库之后。