Linux+CLion+cmake 动态链接库的使用

在作《剑指offer》中的单向链表的题目时,需要一些常用到的操作链表的函数放在一个文件下,我想把这些函数的声明都写在list.h文件中,把这些函数的定义都写在list.cpp文件中,这样就可以在测试文件test.cpp中调用list.cpp中定义的函数,或者我还想把有关l链表操作的函数封装成一个库,安装到电脑中,这个库可以被外部程序调用。

首先看一下动态链接库和静态链接库分别是什么

动态链接库是以.so结尾的文件,静态链接库是以.a结尾的文件。

一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。

一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。

(所以无论是动态链接库还是静态链接库,都会有lib文件)

1.首先是安装链接库

cmake是一个编程项目管理工具。

首先在你的工程目录下创建 list.cpp,list.h, CMakeLists.txt文件,并创建一个lib文件夹来盛放生成的链接库

然后是在CMakeLists.txt文件中添加如下语句

cmake_minimum_required(VERSION 3.5)

project(lib)

set(LIB_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

set(CMAKE_CXX_STANDARD 11)

set(LIST_SRC list.cpp)

ADD_LIBRARY(list SHARED ${LIST_SRC})

ADD_LIBRARY(list_static STATIC ${LIST_SRC})

INSTALL(TARGET list list_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)

INSTALL(FILES list.h DESTINATION include/list)

然后在终端操作安装动态和静态链接库

mkdir build

cd build

cmake DCMAKE_INSTALL_PREFIX=/usr ../

make

sudo make install

如果安装成功,那么就会显示如下信息

--install configuration

--installing: /usr/local/lib/liblist.so

--installing: /usr/local/lib/liblist.a

--Up-to-date: /usr/local/include/list/list/h

2.外部程序使用安装好的动态链接库

在一个新的工程目录下,你创建了test.cpp, CMakeLists.txt文件,在CMakeList.txt文件中写入如下语句

cmake_minimum_required(VERSION 3.5)

project(ListWithDynamic)

set(CMAKE_CXX_STANDARD 11)

include_directories(/usr/local/include/list)

add_executable(ListWithDynamic test.cpp)

target_link_libraries(ListWithDynamic /usr/local/lib/liblist.so)

对于这种我们自己编写安装的链接库,我们在使用的时候首先需要将链接库的头文件包含进来,就是这里的include_directories()函数实现这个功能,然后还需要将目标文件,就是这里的ListWithDynamic链接到liblist.so上,就是这里的target_link_libraries()函数实现这个功能,如果没有这个函数,编辑器会提示错误,“undefined reference to 'CreateListNode'” 

 

3.使用下载安装的第三方库和使用自己编写安装的库的一个在CMakeLists.txt的明显不同是

请查看另一篇文章https://mp.csdn.net/postedit/82380445

 

 

 

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

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

相关文章

PAT(乙级)1009

1009. 说反话 (20)给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。 输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母&…

库存扣减问题

2019独角兽企业重金招聘Python工程师标准>>> 并发减库存 并发扣库存问题总结 库存扣减还有这么多方案? | 架构师之路 转载于:https://my.oschina.net/u/2939155/blog/3004363

HSRPSTPACL

1 HSRP配置 1.1 问题 在企业网络到外部的连接方案中,要求不高的条件下可以是单出口。一旦该出口线路出现问题,整个企业网络就不能连接到外网了。为了使得企业网络到外网连接的高可用性,可以设置两个以上的出口,然而多个出口对…

java 的 CopyOnWriteArrayList类

初识CopyOnWriteArrayList 第一次见到CopyOnWriteArrayList,是在研究JDBC的时候,每一个数据库的Driver都是维护在一个CopyOnWriteArrayList中的,为了证明这一点,贴两段代码,第一段在com.mysql.jdbc.Driver下&#xff0…

科技的趋势!AI将进军了37%的企业

2019独角兽企业重金招聘Python工程师标准>>> 市场研究机构Gartner调查了全球89个国家的逾3,000名信息长(CIO),显示有37%的企业已经或打算于近期内部署人工智能(AI),在4年内成长270%。Gartner研究…

CMakeLists.txt编写规则

在PROJECT_SOURCE_DIR下新建了src, include, lib, bin四个子文件夹。 src文件夹用来存放所有的.cpp文件,include文件夹用来存储所有的.h文件, lib中存放生成的自己编写的共享库, bin中存放所有的可执行文件 用SET来设置.exe可执行文件和共享…

nginx.conf配置详解

######Nginx配置文件nginx.conf中文详解######定义Nginx运行的用户和用户组 user www www;#nginx进程数,建议设置为等于CPU总核心数。 worker_processes 8;#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ] error_log /usr/local…

更新 hadoop eclipse 插件

卸载hadoop 1.1.2插件。并安装新版hadoop 2.2.0插件。 假设直接删除eclipse plugin文件夹下的hadoop 1.1.2插件,会导致hadoop 1.1.2插件残留在eclipse中,在eclipse perspective视图中有Map/Reduce视图,可是没有图标,新建项目也不会…

【K8S学习笔记】Part1:使用端口转发访问集群内的应用

本文介绍如何使用kubectl port-forward命令连接K8S集群中运行的Redis服务。这种连接方式有助于数据库的调试工作。 注意:本文针对K8S的版本号为v1.9,其他版本可能会有少许不同。 0x00 准备工作 在进行该操作之前,需要满足以下条件&#xff1a…

Ubuntu 16.04 桌面菜单栏 任务栏 标题栏消失的解决办法

将home目录下的.cache删除掉就可以了 & cd & sudo rm -r ./.cache

瓜子二手车发12月二手车价格:汉兰达奥德赛CR-V保值率居首

中新网1月22日电 日前,基于海量个人对个人的二手车成交数据,瓜子二手车公布了12月全国及多个核心城市的二手车交易“瓜子价”数据。数据显示,2018年12月全国瓜子二手车严选直卖签约均价为87934元,环比上涨0.16%,同比上…

概率分布之间的距离度量以及python实现(三)

概率分布之间的距离,顾名思义,度量两组样本分布之间的距离 。 1、卡方检验 统计学上的χ2统计量,由于它最初是由英国统计学家Karl Pearson在1900年首次提出的,因此也称之为Pearson χ2,其计算公式为 (i1,2&…

Windows vs Linux:\r\n 与 \r

Linux 下文本文件的换行符为 \nWindows 下文本文件的换行符为 \r\n,占两个字节: \r:归位键(CR),ascii 码为 13\n:换行键(LF),ascii 码位 10也即单行无换行文本…

C++求职题

文章大部分内容转载https://www.cnblogs.com/lanxuezaipiao/p/4127904.html 1.冒泡排序法: 如果有N个数字需要排序,那么需要进行(N-1)趟循环,第i趟循环需要对比的次数为(N-i)。所以可以用双重循环,外层循环用于控制循环的趟数&a…

Python-爬虫-requests

简介 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)#注意:requests库发送请求将网页内容下载下来以后,并不会执行js代码&am…

JS如何监听动画结束

场景描述 在使用JS控制动画时一般需要在动画结束后执行回调去进行DOM的相关操作,所以需要监听动画结束进行回调。JS提供了以下事件用于监听动画的结束,简单总结学习下。 CSS3动画监听事件 transitionEnd事件 transitionEnd事件会在CSS transition动画结束…

封装一个ViewPager真正的实现图片无限循环滚动带导航点

效果图: 大家在写项目的过程中常常会碰到须要实现Viewpager里面载入几张图片来循环自己主动轮播的效果,假设不封装一下的话代码分散在activity里面会显得非常乱。并且也不利于我们下次复用,所以这里我把viewpager的相关代码抽取出来放在了一个…

毕业论文页眉页脚页码插入

用word这么多年,第一次完整的操作了一遍页眉页脚页码的插入过程,其实三者都要要求奇偶页不同 1.页面布局-》右下角箭头-》版式-》奇偶页不同 因为文章不同的部分需要插入不同的页眉页脚页码,所以要在不同的部分插入分解符断开它们的连接 2、…

巴黎市中心降下2019年第一场雪

当地时间1月22日,法国巴黎市中心降下2019年第一场雪,气温也随之下降,街上的行人和车辆均有所减少。中新社记者 李洋 摄一对情侣在埃菲尔铁塔前合影留念。无家可归者在长椅上睡觉。游客在卢浮宫前拍照。

Echarts实现隐藏x轴,y轴,刻度线,网格

"yAxis": [{//就是一月份这个显示为一个线段,而不是数轴那种一个点点"show" : true,"boundaryGap": true,"type": "category","name": "时间","data": ["1月", "2…