cmake使用教程(实操版)(四)

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

一、如何使用外部共享库和头文件

使用上一节中构建的共享库。

1、准备工作

在cmake中创建t4用来存储这一节的资源。

2、编码

编写源文件main.c如下:
cmake使用教程(实操版)(四)
t4下的CMakeLists.txt如下:
cmake使用教程(实操版)(四)
t4下的src下的CMakeLists.txt如下:
cmake使用教程(实操版)(四)

3、外部构建

建立build文件夹,使用cmake …来构建。

cmake ..
make

会的到如下的错误:

/backup/cmake/t4/src/main.c:1:19: error: hello.h:

没有那个文件或目录

4、引入头文件搜索路径

hello.h位于/usr/include/hello目录中,并没有位于系统标准的头文件路径。为了让我们的工程能够找到hello.h头文件,需要引入一个新的指令

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYATEM] dir1 dir2 ...)

这条指令可以用来向工程添加多个特定的头文件搜索路径,路径之间用空格分隔,可以使用双引号将它括起来,默认的行为是追加到当前的头文件搜索路径的后面,你可以通过两种方式来进行控制搜索路径添加的方式:

CMAKE_INCLUDE_DIRECTORIES_BEFORE

通过SET这个cmake变量为on,可以将添加的头文件搜索路径放在已有路径的前面。
通过AFTER或者BEFOR参数,也可以控制是追加还是置前。

现在我们在src/CMakeLists.txt添加一个头文件搜索路径,如下:
添加

INCLUDE_DIRECTORIES(/usr/include/hello)

cmake使用教程(实操版)(四)
如果只添加头文件搜索路径,则还是会出现一个错误:

main.c:(.text+0x12): undefined reference to `HelloFunc'

因为我们还没有将link到共享库libhello上。所以我们需要为target添加共享库,需要将目标文件连接到libhello,这里我们需要引入两个新的指令:

LINK_DIRECTORIES
TARHGET_LINK_LIBRARIES
LINK_DIRECTORIES(directtory1 directory2 ...)

添加非标准的共享库搜索路径,比如在工程内部同时存在共享库和可执行二进制,在编译时就需要指定一下这些共享库的路径。

TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2...)

这个指令可以用来为target添加需要连接的共享库,但是同样可以用于为自己编写的共享库添加共享库添加共享库连接。

进入build/src目录,运行main的结果可能还会出现错误+_+.
cmake使用教程(实操版)(四)
出现错误的原因是:链接器ld找不到库文件。ld默认目录是/lib和/usr/lib,如果放在其他路径也可以,需要让ld知道文件的所在路径。
解决方法如下:
方案一:

# vim /etc/ld.so.conf      //在新的一行中加入库文件所在目录
  /usr/lib  
# ldconfig                 //更新/etc/ld.so.cache文件

方案二:

1.将用户用到的库统一放到一个目录,如 /usr/loca/lib
# cp libXXX.so.X /usr/loca/lib/           
2.向库配置文件中,写入库文件所在目录
# vim /etc/ld.so.conf.d/usr-libs.conf    
  /usr/local/lib  
3.更新/etc/ld.so.cache文件
# ldconfig  

我这里为了方便采用了方案一。如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令,ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态连接库。

得到的结果是:
cmake使用教程(实操版)(四)

查看main的动态链接库情况:
cmake使用教程(实操版)(四)
可以看到main确实连接到了共享库libhello,而且链接的是动态库libhello.so.1.

那如何链接到动态库?
方法很简单:
TARGET_LINK_LIBRERIES(main libhello.a),重新编译连接后。使用指令
指令:ldd src/main(在目录build下)
结果如下:
cmake使用教程(实操版)(四)
可以看到,main确实连接到了静态库libhello.a。

6、特殊的环境变量CMAKE_INCLUUDE_PATH和CMAKE_LIBRARY_PATH

注意,这两个是环境变量不是cmake变量。使用的方法是要在bash中使用export或者在csh中使用SET命令设置或者CMAKE_INCLUDE_PATH=/home/include
cmake …等方式。
这两个变量指的是,如果头文件没有存放在常规路径中,比如(/usr/include,/usr/local/include等),则可以通过这些变量来弥补。
之前在CMakeList.txt中使用了INCLUDE_DIRECTORIES(/usr/include/hello)告诉头文件这个头文件目录。
为了将程序更智能一点,我们可以使用CMAKE_INCLUDE_PATH来进行,使用bash的方法如下:
在指令行中输入:
cmake使用教程(实操版)(四)
然后,再将src/CMakeLisrs.txt中的INCLUDE_DIRECTORIES(/usr/include/hello)替换为:
cmake使用教程(实操版)(四)
指令:FIND_PATH(myHeader NAMES hello.h PATHS /usr/include /usr/include/hello)
这里cmake.h仍然可以找到hello.h存放的路径,就是因为我们设置了环境变量CMAKE_INCLUDE_PATH.

如果你不使用FIND_PATHCMAKE_INCLUDE_PATH变量是没有作用的,你不能指望他会为变化一起命令添加参数-I<CMAKE_INCLUDE_PATH>。

以此为例,CMAKE_LIBRARY_PATH可以用在FIND_LIBRARY

7、小节

如何通过INCLUDE_DIRECTORIES指令加入非标准的头文件搜索路径。
如何通过LINK_DIRECTORIES指令加入非标准的库文件搜索路径。
如何通过TARGET_LINK_LIBRARIES为库或可执行二进制加入库链接。
并解释了如何链接到静态库。下面会介绍一些高级话题,比如编译条件检查、编译器定义、平台判断、如何跟pkgconfig配合使用等等。文章来源地址https://www.toymoban.com/news/detail-407843.html

到了这里,关于cmake使用教程(实操版)(四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • CMake教程系列-02-使用cmake代码生成二进制

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

    2024年02月04日
    浏览(45)
  • 小米随身Wifi如何让手机共享电脑文件 小米wifi共享电脑文件教程

    小米近日推出了一款价格仅19.9元的小米随身Wifi,大小仅有硬币大小,便携性相当不错。小米随身Wifi与360随身Wifi功能上基本相同,只需将小米随身WiFi连接任何可以上网的电脑,就可以轻松为智能手机、Pad平板提供免费Wifi上网。另外小米随身WiFi还具有共享盘功能,可以让智能

    2024年02月06日
    浏览(37)
  • CMake入门教程【实战篇】使用开源库cmake-modules简化项目开发与维护

    本教程介绍了rpavlik/cmake-modules,一个CMake模块集合,旨在简化和优化CMakeLists.txt文件的编写和维护工作。该集合尤其对虚拟现实和物理模拟包的开发者有用,同时也包含通用实用模块和针对旧版CMake的补丁或解决方案。 项目托管在GitHub上,可通过链接访问:rpavlik/cmake-modules 查

    2024年01月15日
    浏览(39)
  • Laravel 使用rdkafka_laravel详细教程(实操避坑)

    首先要看版本兼容问题,我的是Laravel5.6,PHP是7.3.13,所以需要下载兼容此的rdkafka,去 Packagist 搜索 kafka ,我用的是 enqueue/rdkafka选择里面0.10.5版本, 在 Laravel 项目中,通过 Composer 安装  enqueue/rdkafka  扩展包。在项目根目录下的  composer.json  文件中,添加以下依赖项: 也可

    2024年01月25日
    浏览(35)
  • 如何使用CMake的CTest进行单元测试

    如何使用CMake和CTest进行单元测试。 CMake是一个跨平台的构建工具,可以自动生成与平台相关的Makefile或Visual Studio项目文件,简化了C++程序的构建过程。而CTest是CMake的测试工具,它可以自动化运行单元测试,收集测试结果并生成报告。 下面是使用CMake和CTest进行单元测试的步骤

    2024年02月13日
    浏览(25)
  • windows下cmake的小白级入门使用教程(hello world)

    想学习cmake,基于惯性思维,想先跑通一个“hello world”的例子,奈何网上教程一大把,有用的教程破费功夫寻找。大部分教程都没有从新电脑(重装系统后的电脑)的角度讲述步骤。 为了得到干净的电脑环境,研究了一段时间VMware虚拟机,并写了几篇文章,感兴趣的读者可移步

    2024年02月14日
    浏览(31)
  • Maya云渲染如何使用,Maya云渲染流程实操!

    Maya 是一款专业的 3D 软件,用于创建逼真的角色和大片的效果,Maya可以加速工作流程,帮助您专注于创造力并按时完成任务。 也可以为角色和场景添加精美的细节,并提供让客户满意的优质作品。更有无数业内顶级艺术家依靠 Maya来创作更复杂的镜头、角色和世界,说到Ma

    2024年02月06日
    浏览(31)
  • PyQt5教程:如何在PyCharm中添加Qt Designer、PyUIC、PyRcc外部工具?

    Qt Designer 、PyUIC和PyRcc是Qt框架下的三个重要工具,总的来说,这三个工具各司其职,相辅相成,能显著提升Qt开发的速度与效率。 Qt Designer:是一个用于创建图形用户界面的工具,可轻松构建复杂的用户界面。它基于MVC架构,可以将界面设计与逻辑分离,使得开发更为便捷。

    2024年04月28日
    浏览(28)
  • Postman如何做接口测试:如何使用外部 json 文件数据

    在软件测试过程中,你可能已经提前配置了一些环境数据放在通用的配置文件中,你想直接导入这些文件,在 postman 中使用,这样的话,你就不需要重复在 postman 软件中设置了。 比如你可以直接从开发那里得到一个配置文件,里面有 host 地址,数据库地址,每页的列表限制信

    2024年02月07日
    浏览(30)
  • [CMakeLists]使用CMake后如何将目录内容复制到build目录

    你可以用add_custom_command. 说你的目标被调用 MyTarget ,然后你可以这样做: 每次构建 MyTarget 并将\\\"/ config\\\"的内容复制到目标exe/lib最终的目录时,都会执行此操作. 正如马克Lakata在下面评论指出,更换 PRE_BUILD 用 POST_BUILD 在 add_custom_command 确保复制如果生成成功才会发生. 说明 ${CMAKE_CO

    2024年02月16日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包