谷歌翻译
步骤3:添加库的使用要求
练习 1 - 添加库的使用要求
目标参数的使用要求允许更好地控制库或可执行文件的链接和包含行,同时还可以更好地控制 CMake 内目标的传递属性。利用使用要求的主要命令是:
target_compile_definitions()
target_compile_options()
target_include_directories()
target_link_directories()
target_link_options()
target_precompile_headers()
target_sources()
目标
添加库的使用要求。
有用的材料
CMAKE_CURRENT_SOURCE_DIR
要编辑的文件
MathFunctions/CMakeLists.txt
CMakeLists.txt
入门
在本练习中,我们将重构代码以 使用现代 CMake 方法。我们将让我们的库定义自己的使用要求,以便根据需要将它们传递到其他目标。在这种情况下, 将自行指定任何所需的包含目录。然后,使用目标 只需链接到,而不必担心任何其他包含目录。Adding a LibraryMathFunctionsTutorialMathFunctions
目录中提供了起始源代码Step3。在此练习中,完成。TODO 1TODO 3
首先,添加一个调用target_include_directories()在 MathFunctions/CMakeLists。请记住 CMAKE_CURRENT_SOURCE_DIR是当前正在处理的源目录的路径。
然后,更新(并简化!)对 target_include_directories()在顶层CMakeLists.txt。
构建并运行
创建一个名为的新目录Step3_build,运行cmake可执行文件或cmake-gui配置项目,然后使用您选择的构建工具或从构建目录中使用来构建它。以下是命令行中的样子:cmake --build .
mkdir Step3_build
cd Step3_build
cmake …/Step3
cmake --build .
接下来,使用新构建的Tutorial并验证它是否按预期工作。
解决方案
让我们更新上一步的代码以使用现代 CMake 的使用要求方法。
我们想说明的是,任何链接到的人都MathFunctions需要包含当前源目录,而MathFunctions它本身则不需要。这可以用INTERFACE使用要求来表达。记住, INTERFACE这意味着消费者需要但生产者不需要的东西。
最后MathFunctions/CMakeLists.txt,使用 target_include_directories()使用INTERFACE关键字,如下所示:
TODO 1:单击显示/隐藏答案
现在我们已经指定了使用要求,我们可以安全地从顶层 MathFunctions删除对变量的使用。EXTRA_INCLUDESCMakeLists.txt
删除此行:
TODO 2:单击显示/隐藏答案
并EXTRA_INCLUDES从中删除target_include_directories:
TODO 3:单击显示/隐藏答案
请注意,使用此技术,我们的可执行目标使用我们的库时唯一要做的就是调用target_link_libraries()带有库目标的名称。在较大的项目中,手动指定库依赖项的传统方法很快就会变得非常复杂。
练习 2 - 使用接口库设置 C++ 标准
现在我们已经将代码转换为更现代的方法,让我们演示一种将属性设置为多个目标的现代技术。
让我们重构现有代码以使用INTERFACE库。我们将在下一步中使用该库来演示 generator expressions。
目标
添加INTERFACE库目标以指定所需的 C++ 标准。
有用的资源
add_library()
target_compile_features()
target_link_libraries()
要编辑的文件
CMakeLists.txt
MathFunctions/CMakeLists.txt
入门
在这个练习中,我们将重构我们的代码以使用INTERFACE库来指定 C++ 标准。
从第 3 步练习 1 末尾留下的内容开始此练习。您必须完成。TODO 4TODO 7
首先编辑顶层CMakeLists.txt文件。构建一个 INTERFACE名为的库目标tutorial_compiler_flags,并将其指定cxx_std_11为目标编译器功能。
修改CMakeLists.txt和MathFunctions/CMakeLists.txt以便所有目标都有一个target_link_libraries()拨电至 tutorial_compiler_flags。
构建并运行
由于我们已经在练习 1 中配置了构建目录,只需通过调用以下命令重建我们的代码:
cd Step3_build
cmake --build .
接下来,使用新构建的Tutorial并验证它是否按预期工作。
解决方案
让我们更新上一步中的代码,以使用接口库来设置我们的 C++ 要求。
首先,我们需要删除两个set()调用变量 CMAKE_CXX_STANDARD和CMAKE_CXX_STANDARD_REQUIRED。具体要删除的行如下:
CMakeLists.txt
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
接下来,我们需要创建一个接口库,tutorial_compiler_flags然后使用target_compile_features()添加编译器功能 cxx_std_11。
TODO 4:单击显示/隐藏答案
TODO 4:CMakeLists.txt
add_library(tutorial_compiler_flags INTERFACE)
target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)
最后,设置好接口库后,我们需要将可执行文件Tutorial、SqrtLibrary库和MathFunctions 库链接到新tutorial_compiler_flags库。代码分别如下所示:
TODO 5:单击显示/隐藏答案
TODO 5:CMakeLists.txt
target_link_libraries(Tutorial PUBLIC MathFunctions tutorial_compiler_flags)
这:
TODO 6:单击显示/隐藏答案
TODO 6:MathFunctions/CMakeLists.txt
target_link_libraries(SqrtLibrary PUBLIC tutorial_compiler_flags)
和这个:
TODO 7:单击显示/隐藏答案
TODO 7:MathFunctions/CMakeLists.txt
target_link_libraries(MathFunctions PUBLIC tutorial_compiler_flags)
这样,我们所有的代码仍然需要 C++ 11 才能构建。不过请注意,使用这种方法,我们可以明确哪些目标需要特定的要求。此外,我们在接口库中创建了单一事实来源。