CMake中link_directories/target_link_directories的使用

2023-05-16

      CMake中的link_directories命令用于添加目录使链接器能在其查找库(add directories in which the linker will look for libraries),其格式如下:

link_directories([AFTER|BEFORE] directory1 [directory2 ...])

      添加路径使链接器应在其中搜索库。提供给此命令的相对路径被解释为相对于当前源目录
      该命令只适用于在它被调用后创建的target
      这些目录将添加到当前CMakeLists.txt文件的LINK_DIRECTORIES目录属性中,并根据需要将相对路径转换为绝对路径。
      默认情况下,指定的目录将追加到当前目录列表中。可以通过将CMAKE_LINK_DIRECTORIES_BEFORE设置为ON来更改此默认行为。通过显式使用AFTER或BEFORE,你可以在追加和前置之间(between appending and prepending)进行选择,而与默认值无关。
      link_directories的参数可以使用语法为"$<...>"的"生成器表达式"。
      注意:此命令很少是必需的,在有其它选择的情况下应避免使用。在可能的情况下,最好将完整的绝对路径传递给库,因为这可确保始终链接正确的库。find_library命令提供完整路径,通常可以直接用于调用target_link_libraries命令。可能需要库搜索路径的情况包括:
      (1).像Xcode这样的项目生成器(project generators),用户可以在构建时切换目标架构(target architecture),但不能使用库的完整路径,因为它只提供一种架构(即它不是通用的二进制文件)。
      (2).库本身可能还有其它通过RPATH机制找到的私有库依赖项,但是某些链接器无法完全解码这些路径(例如,由于存在$ORIGIN之类的东西)。
      如果必须提供库搜索路径,则最好尽可能使用target_link_directories命令,而不是link_directories命令来本地化效果。特定于target的命令还可以控制搜索目录如何传播到其它依赖targets。

link_directories(/A)
link_directories(BEFORE /B)
set(CMAKE_LINK_DIRECTORIES_BEFORE ON)
link_directories(/C)

get_directory_property(result LINK_DIRECTORIES)
message("result: ${result}") # result: /C;/B;/A

add_executable(main EXCLUDE_FROM_ALL samples/sample_subtraction.cpp)
target_include_directories(main PUBLIC include)

add_library(subtraction SHARED source/subtraction.cpp)
target_include_directories(subtraction PUBLIC include)

target_link_libraries(main subtraction)

get_target_property(result2 main LINK_DIRECTORIES)
message("result2: ${result2}") # result2: /C;/B;/A

      CMake中的target_link_directories命令用于将链接目录添加到target,其格式如下:

target_link_directories(<target> [BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

      指定链接器在链接给定target时应在其中搜索库的路径每项(each item)可以是绝对路径或相对路径,后者被解释为相对于当前源目录。这些项将被添加到链接命令中。
      命名的<target>必须由诸如add_executable或add_library之类的命令创建,并且不能为ALIAS target。
      需要INTERFACE, PUBLIC和PRIVATE关键字来指定它们后面的项的作用域(scope).PRIVATE和PUBLIC项将填充<target>的LINK_DIRECTORIES属性。PUBLIC和INTERFACE项将填充<target>的INTERFACE_LINK_DIRECTORIES属性(IMPORTED targets仅支持INTERFACE项)。每个项指定一个链接目录,如有必要,在将其添加到相关属性之前,将转换为绝对路径。重复调用相同的<target>会按调用顺序追加项。
      如果指定BEFORE,则内容(content)将被添加到相关属性的前面,而不是被追加。
      target_link_directories的参数可以使用语法为$<...>的"生成器表达式"。
      注意:此命令很少是必需的,在有其它选择的情况下应避免使用。在可能的情况下,最好将完整的绝对路径传递给库,因为这可确保始终链接正确的库。find_library命令提供完整路径,通常可以直接用于调用target_link_libraries命令。可能需要库搜索路径的情况包括:
      (1).像Xcode这样的项目生成器(project generators),用户可以在构建时切换目标架构(target architecture),但不能使用库的完整路径,因为它只提供一种架构(即它不是通用的二进制文件)。
      (2).库本身可能还有其它通过RPATH机制找到的私有库依赖项,但是某些链接器无法完全解码这些路径(例如,由于存在$ORIGIN之类的东西)。

add_executable(main EXCLUDE_FROM_ALL samples/sample_subtraction.cpp)
target_include_directories(main PUBLIC include)

add_library(subtraction SHARED EXCLUDE_FROM_ALL source/subtraction.cpp)
target_include_directories(subtraction PUBLIC include)

target_link_libraries(main subtraction)

target_link_directories(main PRIVATE /private/dir INTERFACE /interface/dir)
get_target_property(result main LINK_DIRECTORIES)
message("result: ${result}") # result: /private/dir
get_target_property(result main INTERFACE_LINK_DIRECTORIES)
message("result: ${result}") # result: /interface/dir

target_link_directories(subtraction PUBLIC /public/dir INTERFACE /interface/dir)
get_target_property(result subtraction LINK_DIRECTORIES)
message("reuslt: ${result}") # reuslt: /public/dir

# test no items
target_link_directories(main PRIVATE)

      执行测试代码需要多个文件

      build.sh内容如下:

#! /bin/bash

# supported input parameters(cmake commands)
params=(function macro cmake_parse_arguments \
		find_library find_path find_file find_program find_package \
		cmake_policy cmake_minimum_required project include \
		string list set foreach message option if while return \
		math file configure_file \
		include_directories add_executable add_library target_link_libraries install \
		target_sources add_custom_command add_custom_target \
		add_subdirectory aux_source_directory \
		set_property set_target_properties define_property \
		add_definitions target_compile_definitions target_compile_features \
		add_compile_options target_include_directories link_directories)

usage()
{
	echo "Error: $0 needs to have an input parameter"

	echo "supported input parameters:"
	for param in ${params[@]}; do
		echo "  $0 ${param}"
	done

	exit -1
}

if [ $# != 1 ]; then
	usage
fi

flag=0
for param in ${params[@]}; do
	if [ $1 == ${param} ]; then
		flag=1
		break
	fi
done

if [ ${flag} == 0 ]; then
	echo "Error: parameter \"$1\" is not supported"
	usage
	exit -1
fi

if [[ ! -d "build" ]]; then
	mkdir build
	cd build
else
	cd build
fi

echo "==== test $1 ===="

# test_set.cmake: cmake -DTEST_CMAKE_FEATURE=$1 --log-level=verbose ..
# test_option.cmake: cmake -DTEST_CMAKE_FEATURE=$1 -DBUILD_PYTORCH=ON ..
cmake -DTEST_CMAKE_FEATURE=$1 ..
# It can be executed directly on the terminal, no need to execute build.sh, for example: cmake -P test_set.cmake
make
# make install # only used in cmake files with install command

      主CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.22)
project(cmake_feature_usage)

message("#### current cmake version: ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
include(test_${TEST_CMAKE_FEATURE}.cmake)
message("==== test finish ====")

      test_link_directories.cmake内容为上面的所有测试代码段

      另外还包括三个目录:include,source,samples,它们都是非常简单的实现,仅用于测试,如下:

      可能的执行结果如下图所示:

 

      GitHub: https://github.com/fengbingchun/Linux_Code_Test

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake中link_directories/target_link_directories的使用 的相关文章

随机推荐

  • C语言中select函数简介及使用

    select函数用来检查套接字描述符 sockets descriptors 是否已准备好读 写 xff0c 提供了一种同时检查多个套接字的方法 Linux中select函数的声明在 usr include x86 64 linux gnu
  • VS Code离线安装C/C++插件cpptools-linux-aarch64.vsix

    一 问题 最近VS Code连接jetson nano xff0c 经常提示加载C C 43 43 插件失败 二 解决方法 根据提示 xff0c 在githup上 https github com microsoft vscode cppt
  • 开源库BearSSL介绍及使用

    BearSSL是用C语言实现的SSL TLS协议 xff0c 它的源码可直接通过git clone https www bearssl org git BearSSL 下载 xff0c 它的license是MIT xff0c 最新版本为0
  • 对称加密算法AES之GCM模式简介及在OpenSSL中使用举例

    AES Advanced Encryption Standard 即高级加密标准 xff0c 由美国国家标准和技术协会 NIST 于2000年公布 xff0c 它是一种对称加密算法 关于AES的更多介绍可以参考 xff1a https bl
  • ASN.1简介及OpenSSL中ASN.1接口使用举例

    ASN 1 Abstract Syntax Notation One 是一套标准 xff0c 是描述数据的表示 编码传输 解码的灵活的记法 它提供了一套正式 无歧义和精确的规则以描述独立于特定计算机硬件的对象结构 OpenSSL的编码方法就
  • 从openssl rsa pem文件中提取公私钥数据实现

    RSA为非对称加密算法 xff0c 关于其介绍可以参考 xff1a https blog csdn net fengbingchun article details 43638013 OpenSSL最新版为 1 1 1g xff0c 在Wi
  • 通过OpenSSL的接口实现Base64编解码

    对openssl genrsa产生的rsa私钥pem文件 xff0c 使用普通的base64解码会有问题 xff0c 如使用https blog csdn net fengbingchun article details 85218653
  • JWT(JSON Web Token)简介及实现

    JWT JSON Web Token xff1a 是一个开放标准 RFC 7519 xff0c 它定义了一种紧凑且自包含的方式 xff0c 用于在各方之间作为Json对象安全地传输信息 由于此信息是经过数字签名的 xff0c 因此可以被验证
  • SSL/TLS单向认证和双向认证介绍

    为了便于理解SSL TLS的单向认证和双向认证执行流程 xff0c 这里先介绍一些术语 1 散列函数 Hash function xff1a 又称散列算法 哈希函数 xff0c 是一种从任何一种数据中创建小的数字 指纹 的方法 散列函数把消
  • 使用OpenSSL生成自签名证书相关命令

    在用于小范围测试等目的的时候 xff0c 用户也可以自己生成数字证书 xff0c 但没有任何可信赖的机构签名 xff0c 此类数字证书称为自签名证书 证书一般采用X 509标准格式 下面通过OpenSSL相关命令介绍如何生成自签证书 1 生
  • Windows/Linux TCP Socket网络编程简介及测试代码

    典型的网络应用是由一对程序 即客户程序和服务器程序 组成的 xff0c 它们位于两个不同的端系统中 当运行这两个程序时 xff0c 创建了一个客户进程和一个服务器进程 xff0c 同时它们通过从套接字 socket 读出和写入数据在彼此之间
  • 基于BearSSL实现自签名证书双向认证测试代码

    客户端 服务器端双向认证大致过程 xff1a 可以参考 xff1a https blog csdn net fengbingchun article details 106856332 1 客户端发起连接请求 xff1b 2 服务器端返回消
  • C:\KEIL\C51\intrins.h包含不正确的路径。Keil 头文件路径错误

    步骤1 xff1a 先检查工程中的 include intrins h include stdio h xff0c 各文件之间 是否正确调用 步骤2 xff1a 将 include lt intrins h gt lt reg52 h gt
  • 分享一个Centos8的国内yum源

    使用的是阿里巴巴开源镜像站 xff0c 文件地址 xff1a https span class token punctuation span span class token operator span span class token o
  • 网络数据包分析软件Wireshark简介

    Wireshark是被广泛使用的免费开源的网络协议分析软件 network protocol analyzer 或网络数据包分析软件 xff0c 它可以让你在微观层面上查看网络上发生的事情 xff0c 它的功能是截取网络数据包 xff0c
  • HTTP请求方法介绍

    之前在https blog csdn net fengbingchun article details 85039308 中介绍过HTTP协议 xff0c 在https blog csdn net fengbingchun article
  • TCP Flags标志位介绍

    传输控制协议 Transmission Control Protocol xff0c TCP 是一种传输层协议 TCP使数据包从源到目的地的传输更加顺畅 它是一种面向连接的端到端协议 每个数据包由TCP包裹在一个报头中 xff0c 该报头由
  • 代理服务器简介及libcurl测试

    代理服务器英文全称是Proxy Server xff0c 其功能就是将局域网用户连接到Internet xff0c 代理网络用户去获得网络信息 形象地说 xff0c 它是网络信息的中转站 xff0c 是连接内部局域网和Internet的一种
  • CMake中find_package的使用

    CMake中的命令find package用于查找指定的package find package支持两种主要的搜索方法 xff1a 注意 xff1a lt PackageName gt 是区分大小写的 1 Config mode 配置模式
  • CMake中link_directories/target_link_directories的使用

    CMake中的link directories命令用于添加目录使链接器能在其查找库 add directories in which the linker will look for libraries xff0c 其格式如下 xff1a