CMake教程6:调用lib、dll

这篇具有很好参考价值的文章主要介绍了CMake教程6:调用lib、dll。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

之前我们学到了如何编写一个可执行程序和Library,在继续学习之前,需要解释下target,在cmake中我们可以给executablelibrary设置一个target名字,这样可以方便我们在后续对target进行更加详细的属性设置。

本节我们将学习如何在项目中引用lib,相关的api有:

 

makefile

复制代码

link_libraries(<item>... ...) # item链接到所有目标中 target_link_libraries(<target> ... <item>... ...) # 将item链接到指定的target中

其中item参数支持的情况比较多,提前介绍几种情况:

  • lib name:提供库的名字,让cmake去查找对应的库文件绝对路径
  • lib fullpath:直接一步到位给出库文件的绝对路径
  • target name: 根据target的属性,让cmake查找对应库文件的绝对路径

target_xxx的命令颗粒度更细,是比较高版本的命令。

app调用有源代码的lib

这种情况是有lib的源代码,我们将lib以源代码的方式链接到项目内

项目结构为:

  • main.cpp
  • lib.cpp
  • CMakeLists.txt
 

makefile

复制代码

# app cmake_minimum_required(VERSION 3.0.0) set(app "demo") project(${app} VERSION 0.1.0) add_executable(${app} main.cpp) # lib set(lib "my-lib") project(${lib}) add_library(${lib} ./lib.cpp) # 将lib链接到app target_link_libraries(${app} ${lib})

需要注意的target_link_libraries

  • 第一个target参数来自add_executable的第一个参数
  • 后续item参数来自add_library的第一个参数

app调用第三方lib、dll

这种情况是我们使用第三方的lib,只有头文件和库文件(.a、.dll、*.so

方式1:imported-libraries

 

bash

复制代码

# 设置target名字为dll,并且是一个外部导入的lib # GLOBAL选项可以将target的作用域变为全局,默认是只在目录内可见 add_library(dll SHARED IMPORTED GLOBAL) # 设置target dll的详细属性,dll/lib 不区分debug/release的情况 set_target_properties(dll PROPERTIES # 指向lib,windows必须设置此项 IMPORTED_IMPLIB ${CMAKE_CURRENT_LIST_DIR}/dll.lib # 指向dll、so等 IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/dll.dll ) # 设置debug/release set_target_properties(dll PROPERTIES IMPORTED_IMPLIB_DEBUG ${CMAKE_CURRENT_LIST_DIR}/dll_debug.lib IMPORTED_IMPLIB_RELEASE ${CMAKE_CURRENT_LIST_DIR}/dll_release.lib IMPORTED_LOCATION_DEBUG ${CMAKE_CURRENT_LIST_DIR}/dll_debug.dll IMPORTED_LOCATION_RELEASE ${CMAKE_CURRENT_LIST_DIR}/dll_release.dll ) target_link_libraries(app dll)

这里我们使用的是set_target_properties,可以同时给多个target设置多个不同的属性:

 

scss

复制代码

set_target_properties( target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ... )

方式2:将指定的库文件直接链接到target的不同配置

 

bash

复制代码

target_link_libraries(${target} debug ${debug_fullpath}) target_link_libraries(${target} optimized ${release_fullpath})

这两种方式都可以,原因是target_link_libraries的item参数既可以是target name,也可以是lib fullpath

在xcode中,对应的工程配置为:

  • 当为target name时,出现在command的args中

    CMake教程6:调用lib、dll,cmake,java,c++,前端

  • 当为lib fullpath时,在xcode中的位置在Linking/Others Linker Flags:

    CMake教程6:调用lib、dll,cmake,java,c++,前端

无论使用哪种方式,注意dll、lib必须是存在的,底层查找lib时,不会自动补充lib前缀。

include头文件目录问题

以上仅仅是告诉编译器lib文件的位置在哪里,我们需要添加头文件目录,编译器才能识别到lib api

方式1:直接添加头文件目录,缺点是要手动把使用到的lib include path一个一个加进去,比较麻烦

 

bash

复制代码

# 注意:要放在add_executable、add_library前边才有效 include_directories("a/b/c/")

方式2:给lib target中添加,只要项目依赖了这个target,就会自动将目录添加到项目中

 

makefile

复制代码

# 注意:要放在add_library后边才有效 target_include_directories(lib INTERFACE # 权限控制,类比:public/private/protected ${CMAKE_CURRENT_SOURCE_DIR}/ )

方式3:和方式2没啥区别,写法不同而已

 

makefile

复制代码

set_property(TARGET lib PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_LIST_DIR} )

推荐使用第2种方式。

lib包含目录问题

这种情况对应的是我们target_link_libraries的item参数是lib name,为了让CMake可以通过lib name找到对应的lib文件 ,所以我们才需要设置库包含目录,如果item参数是lib pathtarget name,则不需要设置库包含目录。

相关的命令有link_directoriestarget_link_directories,区别参考上文。

作者:xu__yanfeng
链接:https://juejin.cn/post/7157618014311940126
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。文章来源地址https://www.toymoban.com/news/detail-656516.html

到了这里,关于CMake教程6:调用lib、dll的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cmake中多级CMakeLists.txt调用

      在c/c++工程开发中,往往会涉及多级CMakeLists.txt的调用,并且调用方式错综复杂,主要有以下两种方式: 子目录中的CMakeLists.txt 独立生成目标 ,不作为主目标生成过程主的依赖存在,与主目标并无任何关系。 子目录中的CMakeLists.txt 作为主目标的依赖源文件 ,不单独生成

    2024年02月02日
    浏览(38)
  • [CMake教程] CMake列表 - list

    列表在CMake中大量使用。初始化列表语法如下: 归根结底,列表只是一个由分号分隔列表项的单个字符串,这使得操作单个列表项变得不太方便。CMake提供了 list() 命令来简化这类任务,他的基本语法如下: 其中, command 是处理列表的命令,每个命令有各自的 other_args ,具体

    2024年02月11日
    浏览(45)
  • CMake入门教程【高级篇】qmake转cmake

    😈 「CSDN主页」 :传送门 😈 「Bilibil首页」 :传送门 😈 「动动你的小手」 : 点赞 👍 收藏 ⭐️ 评论 📝

    2024年01月25日
    浏览(51)
  • CMake教程系列-02-使用cmake代码生成二进制

    参考:Cmake安装以及升级(Ubuntu) Win10安装文件: 创建的目录以及代码如下: CMakeLists.txt sample.cpp 目录结构如下:注意多创建一个build目录存放中间文件和最终二进制文件 点击“Configure 我的的vs是2019,在Configure中选择了 点击“Configure”右边的“Generate”。 点击“Generate”右边

    2024年02月04日
    浏览(54)
  • java调用DLL保姆级教程

    工作中有部分业务需要调用三方的dll文件,在网上搜集资料后测试调用成功,如下笔记希望能帮到你们! Java可以使用Java Native Interface (JNI)来调用DLL文件。 1. 定义Native方法:使用Java的“native”定义Java的方法,这个方法将在DLL文件中被实现。 2. 生成Java头文件:使用

    2024年03月16日
    浏览(37)
  • CMake+QT使用教程

    下面是使用 Qt 用 C++ 编写的控制台应用程序的典型文件:CMakeLists.txt 项目目录结构 顶层CMakeLists.txt,包含整个项目的设置并调用add_subdirectory,顶层CMakeLists.txt设置的变量在子目录项目中可见 子目录项目CMakeLists.txt 项目目录结构 库项目文件(src/businesslogic/CMakeLists.txt) 最后,

    2024年02月15日
    浏览(51)
  • [CMake教程] 循环

    作为一个编程语言,CMake也少不了循环流程控制,他提供两种循环 foreach() 和 while() 。 基本语法: 其中 items 可以是由分号或空格分隔的项目列表,也可以是一个列表变量。每次迭代, loop_var 将被赋值为当前项目的值。 foreach() 还有一些进阶的用法: 使用 stop 指定迭代范围(

    2024年02月09日
    浏览(29)
  • CMake详细教程

    本文用于记录CMake学习 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最

    2024年02月10日
    浏览(23)
  • ubuntu安装cmake简易教程

    由于直接用apt指令安装cmake可能会导致版本过低,所以本教程用于安装较新的稳定版cmake。 如果直接按上述一键安装也可以,但是版本会偏低。原因是软件包没有同步更新官网的较新版本,所以我们需要添加镜像源。 通过该指令,可以查看当前环境中的cmake软件包的版本,如

    2024年02月12日
    浏览(37)
  • cmake使用教程(实操版)(四)

    使用上一节中构建的共享库。 1、准备工作 在cmake中创建t4用来存储这一节的资源。 2、编码 编写源文件main.c如下: t4下的CMakeLists.txt如下: t4下的src下的CMakeLists.txt如下: 3、外部构建 建立build文件夹,使用cmake …来构建。 会的到如下的错误: 没有那个文件或目录 4、引入头

    2023年04月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包