cmake入门之二:调用外部共享库和头文件

news2025/1/20 16:27:21

cmake入门之二:调用外部共享库和头文件

  • 1.创建外部共享库
    • 1.1 创建相关文件或文件夹
      • 1.1.1 ext目录下的CMakeLists.txt
      • 1.1.2 ext目录lib文件夹下
        • 1.1.2.1 hello.h
        • 1.1.2.2 hello.c
        • 1.1.2.3 CMakeLists.txt
    • 1.2 编译、安装
  • 2.创建当前项目
    • 2.1 创建相关文件或文件夹
      • 2.1.1 project目录下的CMakeLists.txt
      • 2.1.2 project目录下的src文件夹
        • 2.1.2.1 main.c
        • 2.1.2.2 CMakeLists.txt
    • 2.2 编译
  • 参考文献

cmake入门之一:编译、INSTALL及shell语句
cmake入门之二:调用外部共享库和头文件

此blog整理自cmake-practice,内容与book第五、六章基本一致,仅为了方便后续阅读。

1.创建外部共享库

~/cmake_demo目录下创建ext文件夹。

1.1 创建相关文件或文件夹

创建好的相关文件/文件夹目录如下:
在这里插入图片描述

1.1.1 ext目录下的CMakeLists.txt

PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)

1.1.2 ext目录lib文件夹下

1.1.2.1 hello.h

#ifndef HELLO_H
#define HELLO_H
#include<stdio.h>
void HelloFunc();
#endif

1.1.2.2 hello.c

#include "hello.h"
void HelloFunc()
{
        printf("Hello World!\n");
}

1.1.2.3 CMakeLists.txt

  1 SET(LIBHELLO_SRC hello.c)
  2 ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
  3 ADD_LIBRARY(hello_static  STATIC ${LIBHELLO_SRC})
  4 SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
  5 GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME)
  6 message(STATUS "This is the hello_static OUTPUT_NAME:"${OUTPUT_VALUE})
  7 SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
  8 INSTALL (TARGETS hello hello_static
  9         LIBRARY DESTINATION lib
 10         ARCHIVE DESTINATION lib)
 11 INSTALL(FILES hello.h DESTINATION include/hello)

其中:

  • 第2句编译后生成libhello.so,即被调用的共享库;
  • 第3句用于构建一个 libhello_static.a 的静态库;
  • 第4句用于设置输出的名称,即libhello_static.a会命名为libhello.a的静态库;
  • 第5/6句用于获取属性并打印信息;
  • 第7句用于设置动态库版本号,其中VERSION指代动态库版本,SOVERSION 指代 API 版本;
  • 第8-10为分别安装共享库与静态库;
  • 第11句为安装头文件。

关于安装,cmake-practice书中还给出了一个示例,方便学习:

INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic
)
可执行二进制 myrun 安装到${CMAKE_INSTALL_PREFIX}/bin 目录
动态库 libmylib 安装到${CMAKE_INSTALL_PREFIX}/lib 目录
静态库 libmystaticlib 安装到${CMAKE_INSTALL_PREFIX}/libstatic 目录

1.2 编译、安装

分别执行以下命令:

mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make
sudo make install

最后一步显示结果为:

-- Install configuration: ""
-- Installing: /usr/lib/libhello.so.1.2
-- Up-to-date: /usr/lib/libhello.so.1
-- Up-to-date: /usr/lib/libhello.so
-- Installing: /usr/lib/libhello.a
-- Up-to-date: /usr/include/hello/hello.h

可见hello.h及共享库、静态库均正常安装了。

注意:为了保证接下来操作能正常调用,必须安装在/usr目录下。

2.创建当前项目

~/cmake_demo目录下创建peoject文件夹。

2.1 创建相关文件或文件夹

创建好的项目目录树如下:
在这里插入图片描述

2.1.1 project目录下的CMakeLists.txt

PROJECT(NewHello)
ADD_SUBDIRECTORY(src)

2.1.2 project目录下的src文件夹

2.1.2.1 main.c

#include <hello.h>
int main()
{
        HelloFunc();
        return 0;
}

该程序调用了上面那个项目中的hello.h以及HelloFunc()

2.1.2.2 CMakeLists.txt

  1 ADD_EXECUTABLE(main main.c)
  2 INCLUDE_DIRECTORIES(/usr/include/hello)
  3 TARGET_LINK_LIBRARIES(main hello)
  4 #或者 TARGET_LINK_LIBRARIES(main libhello.so)

其中:

  • 第1句作用是生成可执行文件;
  • 第2句添加头文件hello.h的搜索路径;
  • 第3、4句将目标文件链接到 libhello共享库,以找到 HelloFunc()

2.2 编译

分别执行以下命令:

mkdir build
cd build
cmake ..
make
 ./src/main 
#Hello World!

正常打印Hello World!,说明调用成功!

查看main的链接情况

ldd src/main
#	linux-vdso.so.1 (0x00007fffa9afb000)
#	libhello.so.1 => /usr/lib/libhello.so.1 (0x00007f18035d4000)
#	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f18031e3000)
#	/lib64/ld-linux-x86-64.so.2 (0x00007f18039d8000)

可见正常链接到了共享库libhello.so.1

另外,还可以修改命令以链接到静态库:

TARGET_LINK_LIBRARIES(main libhello.a)

参考文献

[1] cmake-practice

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/161344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么这么努力,还是赚不到钱?你不能不知道赚钱的三个模型

大部分人赚钱&#xff0c;都是通过能力努力运气&#xff0c;这种需要付出自己的大量时间和精力&#xff0c;并且赚到的钱也是有上限的。小部分人赚钱是通过&#xff0c;个人IP的商业模式来赚钱&#xff0c;并且跟我们传统的生意不一样的是&#xff0c;这个亏钱是有下限的&#…

OpenHarmony轻量级设备xts认证大致流程

因为最近公司在做openharmony开发板xts认证&#xff0c;这里对认证过程和过程中遇到的坑做下记录&#xff0c;也给大家探探路。 1. 开发板适配 OpenHarmony轻量系统的移植比较简单&#xff0c;代码中解耦做得非常好。从代码的设计理念上来看&#xff0c;移植主要是3部分的内容…

.vscode/extensions.json和setting.json 是项目用到的插件推荐列表和设置

文章目录前言一、extensions.json安装推荐插件编辑推荐插件二、setting.json总结前言 在前端项目&#xff0c;文件目录中存在.vscode文件夹&#xff0c;文件夹下一般存在两个文件extensions.json和setting.json。作用是保持所有开发者安装了相同的插件和相同的配置&#xff0c…

访问学者J1签证通常准备那些材料?

访问学者J1签证通常准备那些材料&#xff1f;知识人网小编马上整理一下分享出来作为参考&#xff1a;材料准备1、VISA部分&#xff1a;护照&#xff0c;护照照片&#xff0c;160确认页&#xff0c;签证费收据两联都带&#xff0c;DS2019&#xff0c;D7002&#xff0c;sevis费收…

Linux应用基础——监控与管理进程

目录 一、进程 1.定义 2.组成 3.进程环境包括 4.进程的生命周期 二、描述进程状态 三、相关命令 1.top命令 2.ps命令 二、中断进程 1.基本进程管理信号 2.每个信号的默认操作 3.相关命令 &#xff08;1&#xff09;kill命令 &#xff08;2&#xff09;killall命…

助力不文明行文识别,基于YOLOv7融合RepVGG的遛狗牵绳行为检测识别分析系统

不知道大家平时在路上走的时候或者在小区的时候有没有遇上过遛狗不牵绳子的行为&#xff0c;我在实际生活里面可是没少遇到过&#xff0c;有时候特别大的一只狗就这么冲过来&#xff0c;主人却还无动于衷&#xff0c;揍他的心都有了&#xff0c;这种行为的确是很不文明&#xf…

Java项目:仓库管理系统设计和实现(java+ssm+springboot+layui)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 主要功能模块 1.用户模块管理&#xff1a;用户登录、用户注册、用户的查询、添加、删除操作、 2.客户信息管理&#xff1a;.客户列表的展示、添加、修改、删除操作、 3.供应商管理&#xff1a;供应商详情…

Android MVVM之ViewModel的详解与使用

一、介绍 ViewModel 类是一种业务逻辑或屏幕级状态容器。它用于将状态公开给界面&#xff0c;以及封装相关的业务逻辑。 它的主要优点是&#xff0c;它可以缓存状态&#xff0c;并可在配置更改后持久保留相应状态。这意味着在 activity 之间导航时或进行配置更改后&#xff08;…

【UE4 第一人称射击游戏】45-使用线追踪进行破坏

上一篇&#xff1a;【UE4 第一人称射击游戏】44-瞄准时的武器线追踪步骤&#xff1a;打开“Weapon_Base”删除打印节点添加如下节点&#xff0c;表示追踪线命中目标时执行的逻辑对上面逻辑的解释&#xff1a;首先追踪线命中目标后&#xff0c;显示红色的那个准心然后让目标的健…

阿里云 - MaxCompute研究

一、官方介绍MaxCompute是适用于数据分析场景的企业级SaaS&#xff08;Software as a Service&#xff09;模式云数据仓库&#xff0c;提供离线和流式数据的接入&#xff0c;支持大规模数据计算及查询加速能力。MaxCompute适用于100 GB以上规模的存储及计算需求&#xff0c;最大…

全国青少年软件编程(Scratch)等级考试一级考试真题2022年12月——持续更新.....

1.小明想在开始表演之前向大家问好并做自我介绍,应运行下列哪个程序?( ) A. B. C. D. 正确答案:D 答案解析: 外观积木配合显示时间,才能看清楚内容。 2.舞台有两个不同的背景,小猫角色的哪个积木能够切换舞台背景?( ) A.<

UVC静态杀菌模组的工作原理及应用

现代紫外线消毒技术是基于现代防疫学、光学、生物学和物理化学的基础上&#xff0c;利用特殊设计的高效率&#xff0c;高强度和长寿命的C波段紫外光发生装置&#xff0c;产生的强紫外C光照射空气或物体表面&#xff0c;当空气或固体表面中的各种细菌、病毒、寄生虫、水藻以及其…

C/C++ 三维数组和二维数组指针的结合

示例程序&#xff1a;#include <iostream> #include <stdio.h> int main() {int a[3][4] {{1,2,3,4},{2,3,4,5},{3,4,5,6}};int b[3][4] {{10,11,12,13},{11,12,13,14},{12,13,14,15}};int(*aa[2])[4] { a,b };int* p1[3] {a[0],a[1],a[2]};int* p2[3] {b[0],…

小学三年级奥数(和差倍问题)

例题5&#xff1a;学校合唱团成员中,女生人数是男生的3倍,而且女生比男生多80人&#xff0c;合唱团里男生有多少人&#xff1f;女生有多少人&#xff1f;思路分析&#x1f604;&#xff1a;抓住关键语句&#xff0c;女生人数是男生的3倍&#xff0c;那么把男生看成1份&#xff…

《图机器学习》-Graph as Matrix:Page Rnak,

Graph as Matrix一、Graph as Matrix二、PageRank三、PageRank&#xff1a;How to solve&#xff1f;四、Random Walk with Restarts and Personalized PageRank五、Matrix Factorization and Node Embedding一、Graph as Matrix 本小节将从矩阵的角度研究图形分析和学习。 把…

centos 一个ip绑定双网卡

nmcli con show (绿正常&#xff0c;黄白不正常) nmcli con del uuid &#xff08;eg&#xff1a;nmcli con del 585bdacc-314f-423e-a935-18295d0fb48b&#xff09; nmcli con add type bond ifname bond0 mode active-backup &#xff08;bond0只是一个名称&#xff0c;可以…

操作系统导论-并发

操作系统导论-并发 一.并发 操作系统为了进程能有多个执行点&#xff0c;为进程提供了一种抽象&#xff1a;线程。线程与进程类似&#xff0c;一个进程中的所有线程共享地址空间&#xff0c;但有自己独立的栈。 1.并发问题 线程的执行顺序也需要操作系统来进行调度。由于线程…

DeViSE:A Deep Visual-Semantic Embedding Model

这篇是2013年文章提出的DeViSEDeViSEDeViSE,主要是综合了传统视觉识别的神经网络和词向量处理word2vecword2vecword2vec中的Skip−gramSkip-gramSkip−gram模型&#xff0c;实现了一个视觉和语义兼顾的ZSLZSLZSL模型&#xff0c;取得了 较好的效果&#xff0c;时至今日&#xf…

【阶段三】Python机器学习21篇:机器学习项目实战:GBDT算法的核心思想、原理概述、原理举例与GBDT回归模型

本篇的思维导图: GBDT算法的核心思想 GBDT是Gradient Boosting Decision Tree(梯度提升树)的缩写。GBDT算法也是一种非常实用的Boosting算法,它与AdaBoost算法的区别在于:AdaBoost算法根据分类效果调整权重并不断迭代,最终生成强学习器;GBDT算法则将损失函数的…

浅聊版本发布

在一般情况下&#xff0c;升级服务器端应用&#xff0c;需要将应用源码或程序包上传到服务器&#xff0c;然后停止掉老版本服务&#xff0c;再启动新版本。但是这种简单的发布方式存在两个问题&#xff0c; &#xff08;1&#xff09;在新版本升级过程中&#xff0c;服务是会暂…