首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果目标存在,则使用CMake生成器表达式进行链接

CMake是一个跨平台的开源构建工具,用于管理软件构建过程。CMake生成器表达式是一种特殊的语法,用于在构建过程中根据目标的存在与否进行条件判断和操作。

生成器表达式可以用于链接目标文件和库文件,以及设置编译选项和链接选项。在处理链接时,可以使用生成器表达式来判断目标是否存在,从而决定是否链接某个库文件。

生成器表达式的语法格式为:$<...>,其中...表示表达式的内容。常用的生成器表达式包括:

  • $<TARGET_EXISTS:target>:判断目标是否存在,如果目标存在则返回真,否则返回假。
  • $<TARGET_LINKER_FILE:target>:获取目标的链接器文件路径。
  • $<TARGET_LINK_LIBRARIES:target, library>:将目标链接到指定的库文件。
  • $<IF:condition, true_value, false_value>:根据条件判断返回不同的值。

使用CMake生成器表达式进行链接的优势在于可以根据目标的存在与否动态地进行链接操作,提高了构建过程的灵活性和可维护性。

以下是一个示例,演示如何使用CMake生成器表达式进行链接:

代码语言:txt
复制
cmake_minimum_required(VERSION 3.12)
project(MyProject)

add_executable(myapp main.cpp)

# 判断库文件是否存在,如果存在则链接
if(TARGET mylib)
    target_link_libraries(myapp PRIVATE $<TARGET_LINK_LIBRARIES:mylib>)
endif()

在上述示例中,如果名为mylib的目标存在,则将其链接到myapp可执行文件中。

对于这个问题,腾讯云提供了一系列与云计算相关的产品,包括云服务器、云数据库、云存储等。具体推荐的产品和产品介绍链接地址可以根据实际需求和场景进行选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CMake简易指南

cmake 命令,通常写在 CMakeLists.txt / *.cmake 文件中调用的内置语法和函数都称之为 cmake 命令cmake-generator-expressions:生成器表达式,...Google Ninja,Ninja 属于目标编译系统,且效率很高,默认会根据系统处理器内核数来分配编译线程数,如果条件允许,尽可能使用Ninja作为目标编译系统,使用时需要安装ninja到环境变量PATH...POST_BUILD:链接目标文件之后生成器表达式cmake 中,除了常规的命令行,如if(xxx),还支持一种特殊语法 生成器表达式生成器表达式与常规命令不同,常规命令在 配置 阶段生效,而生成器表达式在...编译 阶段才针对生成器进行计算评估。...,并链接指定的系统库文件,生成最终的目标文件。

81050

面向 C++ 的现代 CMake 教程(二)

本部分包括以下章节: 第四章,与目标一起工作 第五章,使用 CMake 编译 C++源代码 第六章,用 CMake 进行链接 第七章,用 CMake 管理依赖关系 第四章:使用目标...>与COMPILE_LANG_AND_ID类似,但检查链接步骤使用的语言。使用表达式指定特定语言和链接器组合的目标链接库、链接选项、链接目录和链接依赖项。...如果编译器支持,CMake 将添加-rtti标志。 嵌套生成器表达式 有时,在尝试在生成器表达式中嵌套元素时,不清楚会发生什么。我们可以通过生成测试输出到调试文件来调试这些表达式。...如果您需要在变量中使用尖括号,请使用$。 条件表达式与 BOOL 运算符评估之间的区别 生成器表达式在评估布尔类型到字符串时可能会有些令人困惑。...重要提示:* 如果你需要内部预编译头文件但仍然希望安装导出目标,那么第四章,《使用目标》中描述的$生成器表达式将防止头文件出现在使用要求中。

56500
  • CMake 秘籍(三)

    如果设置了这些属性,测试输出将被检查与作为参数给出的正则表达式列表进行匹配,如果至少有一个正则表达式匹配,测试分别通过或失败。还有许多其他属性可以设置在测试上。...使用 add_custom_target 在构建时间对特定目标运行自定义命令 探测编译和链接 探测编译器标志 探测执行 使用生成器表达式微调配置和编译 引言 在本章中,...在本例中,我们将使用一个导入的目标链接 MPI,该功能仅从 CMake 3.9 开始提供。然而,生成器表达式的方面可以转移到 CMake 3.0 或更高版本。...在我们的例子中,我们将使用生成器表达式来有条件地设置链接依赖和编译定义。...在第四章,创建和运行测试中,我们使用生成器表达式来解析特定目标的文件路径。在第十一章,打包项目中,我们也会欣赏生成器表达式

    58920

    面向 C++ 的现代 CMake 教程(四)

    链接使用的(Link what you use) 以下是 CMake 博客上对 link-what-you-use 的描述: 这是一个内置的 CMake 功能,使用 ld 和 ldd 的选项来输出如果可执行文件链接了比实际需要更多的库...这些都是建立在迄今为止我们所学习的一切之上的高级技术:管理目标和它们的依赖关系、瞬态使用需求、生成器表达式等等。 安装使我们的项目能够在系统范围内被发现和访问。...CMake 支持相对路径、绝对路径以及生成器表达式。只需记住,如果你的文件路径以生成器表达式开始,那么它必须是绝对的。 下一个必需的关键字是 TYPE 或 DESTINATION。...(),但它会检查是否存在如果存在则会导致FATAL_ERROR。...SameMinorVersion如果前两个组件相同(忽略patch)匹配。 SameMajorVersion如果第一个组件相同(忽略minor和patch)匹配。

    59200

    CMake简介及使用实例

    这里 target必须已经被创建,链接的item可以是已经存在的 target(依赖关系会自动添加) 使用范例:target_link_libraries(Main Lib) set命令 命令语法:set...默认的情况下,VAR会被保存在 Cache中,这时候我们需要清除 VAR 才可以进行下一次查询(使用 unset命令)。...(目录)路径列表并保存在 variable中 #文件路径列表中的每个文件的文件名都能匹配 globbing expressions(非正则表达式,但是类似) #如果指定了 RELATIVE路径,那么返回的文件路径列表中的路径为相对于...如果使用 CMake生成 Makefile时,我们需要做一些不同的工作。CMake存在一个变量CMAKE_BUILD_TYPE用于指定构建类型,此变量只用于基于 make的生成器。...使用了 add_subdirectory指定了需要进行构建的子目录,并且使用了target_link_libraries命令,表示 Main可执行文件需要链接 Lib 库。

    2.5K21

    面向 C++ 的现代 CMake 教程(五)

    目标属性和传递使用要求(传播属性)使配置接近目标定义。 生成器表达式将在解决方案中多次出现,但我们将其尽可能保持简单。...第五章,使用 CMake 编译 C++源代码: 没有编译的 C++项目是不存在的。基础知识相当简单,但 CMake 允许我们在许多方面调整此过程:扩展目标源、配置优化器、提供调试信息。...:objlib>生成器表达式作为编译元素添加到其他目标中: add_library(......本书的第二部分教导我们如何使用 CMake 进行构建:如何使用目标,自定义命令,构建类型和生成器表达式。我们深入探讨了编译的技术细节,以及预处理器和优化器的配置。我们讨论了链接,并介绍了不同的库类型。...string(GENEX_STRIP ) 移除中使用的所有生成器表达式,并将结果存储在变量中。

    14600

    万字总结编译利器CMake,从入门到项目实战演练

    当用户选择了之后,这个值会被保存在CACHE中,这样就不需要每次CMAKE进行更改了。下面一步条件构建和链接MathFunctions库。...利用使用要求的主要命令是: 目标编译定义 目标编译选项 目标包含目录 目标链接库 让我们从第2步中重构代码,以利用现代的CMake方法编写使用要求。...使用CMake文档,您可以找到一个帮助器模块来简化此过程吗? (第10步)添加生成器表达式 在构建系统生成期间会评估生成器表达式,以生成特定于每个构建配置的信息。...生成器表达式可用于启用条件链接,编译时使用的条件定义,条件包含目录等。条件可以基于构建配置,目标属性,平台信息或任何其他可查询信息。 生成器表达式有不同类型,包括逻辑,信息和输出表达式。...生成器表达式的常见用法是有条件地添加编译器标志,例如用于语言级别或警告的标志。一个不错的模式是将该信息与一个INTERFACE目标相关联,以允许该信息传播。

    1.2K00

    CMake库打包以及支持find_package

    这个CMake文件同样能够生成config_impl.hpp,并保存在当前定义的库生成的二进制目录中(${CMAKE_CURRENT_BINARY_DIR}),然后被包含在config.hpp中,最终在库被使用能够被找到...CMake导出库经过上述步骤,我们已经安装了我们库的所有东西,现在其他用户可以通过include_directories和add_libraries以及制定链接目标等相应操作来使用我们的库,但是我们希望能够像...为了使用导出功能,需要创建一个my_library.cmake文件,其中包含了所有编译和安装目标的引用,用户只需要包含这个文件就可以使用前面编译和安装的库。...CMake有一个特性可以支持修复上述的问题,就是生成器表达式,这个特性可以允许设定目标对象在构建和安装时,使用不同的include目录,我们需要将target_include_directories()...生成器表达式来设置正确的include目录。

    43100

    面向 C++ 的现代 CMake 教程(一)

    在这个阶段,CMake 仍然可以通过评估生成器表达式来对构建配置进行一些最后的润色。 注意 生成阶段在配置阶段自动执行后执行。...CPack 的工作方式与 CMake 非常相似:它使用 CMake 语言进行配置,并有许多可供选择的包生成器(只是不要将它们与 CMake 构建系统生成器混淆)。...如果上述条件都不满足,执行将继续endif()命令之后进行。 提供的表达式根据一个非常简单的语法进行评估。...但大多数时候,只需要以下操作符(对于绝对路径的行为定义得很清楚): EXISTS :检查文件或目录是否存在 这解决了符号链接如果符号链接目标存在... IS_NEWER_THAN :检查哪个文件更新 如果file1比(或等于)file2新,或者这两个文件中的一个不存在返回true。

    1.2K01

    CMake 使用学习

    2.1 缓存选项 CMake 支持缓存选项。在 CMake 中,如果一个变量被标记为「缓存」, cmake 的时候会将其写入到 CMakeCache.txt 文件中。...为目标文件添加链接库 target_link_libraries(one -lcrypt -lcap) one 是 CMake 创建的目标文件的名称。.../include> $ ) BUILD_INTERFACE 表达式包装的构建需求只被在同一个构建系统下,或者使用 export() 指令导出的目标使用...INSTALL_INTERFACE 表达式包装的构建需求只被用在使用 install(EXPORT) 指令安装和导出的目标上: 3.9 函数和宏 函数和宏的唯一区别在于作用域,函数有作用域但宏没有。.../宏调用时传入了 cmake_parse_arguments() 未指定的其他参数,其内容均保存在 COMPLEX_PREFIX_UNPARSED_ARGUMENTS 变量中。

    2.5K30

    CMake 秘籍(六)

    使用以下命令,我们可以列出可用的目标(示例输出是在使用 Unix Makefiles 作为生成器的 GNU/Linux 系统上获得的): $ cmake --build ....让我们从最后一点开始:我们不知道确切的名称,但在生成构建系统时 CMake 知道,因此我们在interface_file_names.cfg.in中使用生成器表达式来扩展占位符: [configuration...这可以像任何其他目标一样使用,并将为任何依赖目标设置包含目录、编译器选项和链接库。...在我们的例子中,必须设置-m64,但仅在使用 GNU 或 AppleClang 编译器时。请注意,我们使用生成器表达式来执行此操作。...再次,这些情况都优雅地使用生成器表达式处理。 我们刚刚在 IntelMKL 目标上设置的属性可以通过cmake_print_properties命令打印出来供用户查看。

    36700

    小白入门笔记:CMake编译过程详解

    如果设置了min的value值,必须小于max的value值。...此外,CMake还接受其他值作为add_library的第二个参数的有效值: • STATIC:用于创建静态库,即编译文件的打包存档,以便在链接其他目标使用,例如:可执行文件。...• OBJECT:可将给定add_library的列表中的源码编译到目标文件,不将它们归档到静态库中,也不能将它们链接到共享对象中。如果需要一次性创建静态库和动态库,那么使用对象库尤其有用。...与SHARED库不同,它们不链接到项目中的任何目标,不过可以进行动态加载。该参数可以用于构建运行时插件。...注意,如果项目列表位于变量中,必须显式展开它;也就是说,${sources_with_lower_optimization} 必须作为参数传递。 e.g.

    6K31

    CMake学习笔记(二)——CMake语法

    注:如果进行设置,使用ADD_LIBRARY时又没有指定库类型,默认编译生成的库都是静态库。 CMAKE_C_FLAGS 设置C编译选项 CMAKE_CXX_FLAGS 设置C++编译选项 二....如果是内部编译,上面两个变量相同;如果是外部编译,两个变量不同。...如果cmake参数和CMakeLists.txt文件中都不指定该值的话,该值为默认的/usr/local。 4....构建或安装时,如果平台支持符号链接,且链接器支持so名称,那么恰当的符号链接将会被创建。如果只指定两者中的一个,缺失的另一个假定为具有相同版本号。...注:如果希望使用CMAKE_INSTALL_PREFIX定义安装路径,就需要使用相对路径,这时候安装后的路径就是${CMAKE_INSTALL_PREFIX}/ 其余参数待笔者使用到再进行补充吧

    5.5K100

    面向 C++ 的现代 CMake 教程(三)

    我们已经知道,如果_FOUND变量被设置为1,库被找到,我们可以直接使用它。...首先,我们可能选择不使用 CMake 内置的此方法,而是提供一个自定义命令(在此处支持生成器表达式): DOWNLOAD_COMMAND ......自 v3.20 起,CMake使用上游的GTestConfig.cmake配置文件(如果存在),而不是依赖于可能过时的查找模块。...然后我们在AddRandomNumber()中使用这个字段来获取生成的值。生产代码将使用一个真正的数字生成器;测试将使用模拟。记住我们需要对指针进行解引用以启用多态。...运行target可执行文件(使用生成器表达式获取其路径)。$是一个特殊的生成器表达式,在此情况下它会隐式地添加对target的依赖,使其在执行所有命令之前构建。

    54600

    CMake vs Makefile: 如何选择适合你的项目构建工具

    CMake是一个跨平台的构建工具,它可以自动生成Makefile,而Makefile是一个GNU工具,用于描述源文件之间的依赖关系并指定如何编译和链接它们 ---- 语法 Makefile使用一种基于...因此,如果您要在多个平台上构建软件,那么CMake是更好的选择。 ---- 可扩展性 CMake支持插件,可以轻松地添加新的构建目标生成器。这意味着,开发人员可以根据需要定制CMake的行为。...相比之下,Makefile需要手动编写新的规则和目标,因此,如果您需要一个更加灵活和可定制的构建工具,那么CMake是更好的选择。...自动化构建:如果您需要自动化构建过程,CMake是更好的选择,因为它可以自动生成Makefile并自动化构建过程。而Makefile需要手动编写和维护。...如果您需要跨平台支持和自动化构建,CMake是更好的选择。如果您只是需要管理小型项目,使用Makefile可能更加简单和方便。

    61000

    CMake常用命令的一些整理

    ,例如: lib1.a lib2.a在目录${PROJECT_SOURCE_DIR}/lib/linux下,先设置链接目录,再链接相应的库: #设置链接目录 link_directories( ${PROJECT_SOURCE_DIR...DESTINATION lib) ARCHIVE指静态库,LIBRARY指动态库,RUNTIME指可执行目标二进制,上述示例的意思是: 如果目标util是可执行二进制目标安装到${CMAKE_INSTALL_PREFIX...}/bin目录 如果目标util是静态库,安装到安装到${CMAKE_INSTALL_PREFIX}/lib目录 如果目标util是动态库,安装到安装到${CMAKE_INSTALL_PREFIX}...如果进行设置,使用ADD_LIBRARY时又没有指定库类型,默认编译生成的库都是静态库; CMAKE_C_FLAGS 设置C编译选项,也可以通过指令ADD_DEFINITIONS()添加; CMAKE_CXX_FLAGS...):如果目录或文件存在为真; if (file1 IS_NEWER_THAN file2):当 file1 比 file2 新,或 file1/file2 中有一个不存在时为真,文件名需使用全路径; if

    1.6K10

    CMakecmake的install指令「建议收藏」

    ; OPTIONAL:如果要安装的文件不存在,则指定不是错误。...; OPTIONAL:如果要安装的文件不存在,则指定不是错误; RENAME:指定已安装文件的名称,该名称可能与原始文件不同。...可以使用PATTERN或REGEX选项以精细的粒度控制目录的安装,可以指定一个通配模式或正则表达式以匹配输入目录中遇到的目录或文件。...PATTERN仅匹配完整的文件名,而REGEX将匹配文件名的任何部分,但它可以使用/和$模拟PATTERN行为。 某些跟随PATTERN或REGEX表达式后的参数,仅应用于满足表达式的文件或目录。...SCRIPT参数将在安装过程中调用给定的CMake脚本文件(即.cmake脚本文件),如果脚本文件名是相对路径,则将相对于当前源目录进行解释。CODE参数将在安装过程中调用给定的CMake代码。

    8.3K20

    CMake file命令参数GLOB和GLOB_RECURSE

    如果文件已经存在,该命令会覆盖已有的文件;如果文件不存在,它将创建该文件。 APPEND选项和WRITE选项一样,将会写一条消息到名为filename的文件中,只是该消息会附加到文件末尾。...如果为一个表达式指定了RELATIVE标志,返回的结果将会是相对于给定路径的相对路径。文件名查询表达式的例子有: *.cxx - 匹配所有扩展名为cxx的文件。 *.vt?...作为符号链接的子路径只有在给定FOLLOW_SYMLINKS选项或者cmake策略CMP0009被设置为NEW时,才会被寻访到。...COPY版本把文件、目录以及符号连接拷贝到一个目标文件夹。相对输入路径的评估是基于当前的源代码目录进行的,相对目标路径的评估是基于当前的构建目录进行的。...复制过程将保留输入文件的时间戳;并且如果目标路径处存在同名同时间戳的文件,复制命令会把它优化掉。

    3.7K10

    披着CLion的外衣实则在讲CMake

    修改该变量的值,如果存在则会创建并初始化为对应的值,这里对 set 的使用是设置了 CMAKE_CXX_STANDARD 变量为 17,这个变量可以控制最终编译采用的 C++ 版本,这里是使用 C...() 通过调整链接时的 flag 防止动态链接,因为如果你是使用 Windows 平台下的编译工具链,CLion 有些时候最终链接并不是采用静态链接,导致你最终生成的可执行程序没法直接执行,这个时候你就需要使用下面的命令来强制静态链接了...有些命令如 target_include_directories 和 target_link_directories 是根据目标 target 是否被链接使用来生效的,所以这些命令的作用范围与执行顺序无关...Globbing 表达式与正则表达式类似,但更简单,比如如果要实现前一个命令的功能可以这么写:file(GLOB SRC "${PROJECT_SOURCE_DIR}/*.cc"),如果 GLOB 换成...REQUIRED :该参数表示如果没找到,那么直接产生 cmake 错误,退出 cmake 执行过程,如果没有 REQUIRED,即使没找到也不会终止编译。

    4.9K30

    opencv使用教程_opencv使用教程

    图1:对于计算机来说,汽车的后视镜就是一组栅格状排列的数字 图2:视觉的不适定问题,物体的二维表示可能随着视点的不同完全改变 一个数学物理定解问题的解如果存在,唯一并且稳定的,说明该问题是适定的...(well-posed);如果不满足,说明该问题是不适定的(ill-posed)。...如果希望使用 OpenCV 的动态链接库(DLL),就需要告诉系统在哪里找到它的二进制库。为了完成这一目标,只需要在库路径中添加%OPENCV_DIR%\bin。...注意,如果使用 CMake 来建工程,就没有必要安装 OpenCV,只需要指定生成的 OpenCVConfig.cmake 件的路径就可以了。...在 Qt 生成器 IDE 使用 qmake 工具替代 CMake,可简化软件项目的构建过程。只需几行信息,即可自动产生生成文件。

    10K10
    领券