7.8 使用target_sources避免全局变量
Last updated
Was this helpful?
Last updated
Was this helpful?
NOTE:此示例代码可以在 中找到,其中有一个C++示例。该示例在CMake 3.5版(或更高版本)中是有效的,并且已经在GNU/Linux、macOS和Windows上进行过测试。
本示例中,我们将讨论前一个示例的另一种方法,并不使用add_subdirectory
的情况下,使用module include
组装不同的CMakeLists.txt文件。这种方法的灵感来自 ,其允许我们使用target_link_libraries
链接到当前目录之外定义的目标。
将使用与前一个示例相同的源代码。惟一的更改将出现在CMakeLists.txt
文件中,我们将在下面的部分中讨论这些更改。
主CMakeLists.txt
包含以下内容:
与前一个示例相比,external/CMakeLists.txt
文件没有变化。
src/CMakeLists.txt
文件定义了两个库(automaton和evolution):
src/evolution/CMakeLists.txt
文件包含以下内容:
其余CMakeLists.txt
文件和src/initial/CMakeLists.txt
相同:
配置、构建和测试的结果与前面的方法相同:
与之前的示例不同,我们定义了三个库:
conversion(在external定义)
automaton(包含除转换之外的所有源)
evolution(在src/evolution
中定义,并通过cpp_test
链接)
本例中,通过使用include()
引用CMakeLists.txt
文件,我们在父范围内,仍然能保持所有目标可用:
我们可以构建一个包含树,记住当进入子目录(src/CMakeLists.txt
)时,我们需要使用相对于父范围的路径:
这样,我们就可以定义并链接到通过include()
语句访问文件树中任何位置的目标。但是,我们应该选择在对维护人员和代码贡献者容易看到的地方,去定义它们。
对于当前设置,我们得到如下依赖关系图:
我们可以再次使用CMake和Graphviz (: