C++中Cmake的构建静态库和动态库是什么
C++中Cmake的构建静态库和动态库是什么
这篇文章主要为大家展示了“C++中Cmake的构建静态库和动态库是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++中Cmake的构建静态库和动态库是什么”这篇文章吧。
静态库和动态库的区别
1、静态库的扩展名一般为".a"或者".lib";动态库的扩展名一般为".so"或者".dll"。
2、静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可以独立运行
3、动态库在编译时不会放到连接的目标程序中,即可执行文件无法单独运行。
构建示例
创建新项目cmake02,包含目录如下
hello.h中的内容
#ifndefHELLO_H#defineHELLO_HvoidHelloFunc();#endif
hello.cpp中的内容
#include"hello.h"#include 项目中CMakeLists.txt内容 PROJECT(HELLO)ADD_SUBDIRECTORY(libbin) lib中CMakeLists.txt内容 SET(LIBHELLO_SRChello.cpp)ADD_LIBRARY(helloSHARED${LIBHELLO_SRC}) hello:就是正常的库名,生成的名字前面会加上lib,最终产生的文件是libhello.so SHARED,动态库STATIC,静态库 ${LIBHELLO_SRC}:源文件 //如果用这种方式,只会构建一个动态库,不会构建出静态库,虽然静态库的后缀是.a ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC}) //修改静态库的名字,这样是可以的,但是我们往往希望他们的名字是相同的,只是后缀不同而已 ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) ADD_LIBRARY(hello_static STATIC${LIBHELLO_SRC}) 这条指令可以用来设置输出的名称,对于动态库,还可以用来指定动态库版本和API版本 同时构建静态和动态库示例 SET(LIBHELLO_SRChello.cpp)ADD_LIBRARY(hello_staticSTATIC${LIBHELLO_SRC})SET_TARGET_PROPERTIES(hello_staticPROPERTIESOUTPUT_NAME"hello")SET_TARGET_PROPERTIES(hello_staticPROPERTIESCLEAN_DIRECT_OUTPUT$ADD_LIBRARY(helloSHARED${LIBHELLO_SRC})SET_TARGET_PROPERTIES(helloPROPERTIESOUTPUT_NAME"hello")SET_TARGET_PROPERTIES(helloPROPERTIESCLEAN_DIRECT_OUTPUT1) 一般动态库都会有一个版本号的关联 libhello.so.1.2 libhello.so->libhello.so.1 libhello.so.1->libhello.so.1.2 CMakeList.txt插入如下 SET_TARGET_PROPERTIES(helloPROPERTIESVERSION1.2SOVERSION1) VERSION指代动态库版本,SOVERSION指代API版本 本例中我们将hello的共享库安装到 将hello.h安装到 //文件放到该目录下INSTALL(FILEShello.hDESTINATIONinclude/hello)//二进制,静态库,动态库安装都是用TARGETS//ARCHIVE特指静态库,LIBRATY特指动态库,RUNTIME特指可执行目标二进制INSTALL(TARGETShellohello_staticLIBRARYDESTINATIONlibARCHIVEDESTINATIONlib) 注意:安装的时候,指定一下路径,放到系统下 新建cmake03目录来使用外部共享库和头文件 main.cpp内容 #include PS: 关键字: 在CMakeLists.txt中加入头文件搜索路径 INCLUDE_DIRECTORIES(/usr/local/include/hello) 关键字: 指定第三方库锁在路径, 关键字: 在 TARGET_LINK_LIBRARIES(hellolibhello.so) cmake后make 执行bin目录下的./hello报错 解决:mv /usr/local/lib/libhello.so /usr/lib64/ 查看main的链接情况 链接静态库 TARGET_LINK_LIBRARIES(hello libhello.a) 注意:这两个是环境变量而不是cmake变量,可以在linux的bash中进行设置 在上面例子中使用了绝对路径 我们还可以使用环境变量 生产debug版本的方法: cmake .. -DCMAKE_BUILD_TYPE=debug 以上是“C++中Cmake的构建静态库和动态库是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!ADD_LIBRARY
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
同时构建静态和动态库
SET_TARGET_PROPERTIES
动态库的版本号
安装共享库和头文件
cmake -DCMAKE_INSTALL_PERFIX=/usr ..
使用外部共享库和头文件
解决 :make后头文件找不到的问题
include
这样是可以的INCLUDE_DIRECTORIES
这条指令可以用来向工程添加多个特定的头文件搜索路径,路径之间用空格分割解决:找到引用的函数问题
LINK_DIRCTORIES
添加非标准的共享库搜索路径LINK_DIRECTORIES(/home/myproject/libs)
TARGET_LINK_LIBRARIES
添加需要链接的共享库TARGET_LINK_LIBRARIES
的时候,只需要给出动态链接库的名字就行了。CMakeLists.txt
中插入连接共享库,主要要插在executable的后面特殊的环境变量CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH
INCLUDE_DIRECTORIES(/usr/include/hello)
来指明include路径的位置export CMAKE_INCLUDE_PATH=/usr/local/include/hello
推荐阅读
-
C++之list容器模拟怎么实现
C++之list容器模拟怎么实现这篇“C++之list容器模拟怎么...
-
C++深浅拷贝及简易string类怎么实现
C++深浅拷贝及简易string类怎么实现这篇“C++深浅拷贝及简...
-
C++之list容器如何使用
C++之list容器如何使用今天小编给大家分享一下C++之list...
-
C++内存对齐如何实现
C++内存对齐如何实现本篇内容介绍了“C++内存对齐如何实现”的有...
-
C/C++如何获取CAN信号
C/C++如何获取CAN信号本篇内容主要讲解“C/C++如何获取C...
-
C/C++程序链接与反汇编工具objdump如何使用
C/C++程序链接与反汇编工具objdump如何使用这篇文章主要介...
-
C++聚合体初始化的方法是什么
C++聚合体初始化的方法是什么本篇内容介绍了“C++聚合体初始化的...
-
C++引用如何使用
C++引用如何使用这篇文章主要介绍“C++引用如何使用”的相关知识...
-
C++类和对象之封装及class与struct的区别是什么
-
C++怎么实现softmax函数
C++怎么实现softmax函数本篇内容主要讲解“C++怎么实现s...