千家信息网

C++中Cmake的构建静态库和动态库是什么

发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,这篇文章主要为大家展示了"C++中Cmake的构建静态库和动态库是什么",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C++中Cmake的构建静态库和动态库
千家信息网最后更新 2025年11月16日C++中Cmake的构建静态库和动态库是什么

这篇文章主要为大家展示了"C++中Cmake的构建静态库和动态库是什么",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C++中Cmake的构建静态库和动态库是什么"这篇文章吧。

    静态库和动态库的区别

    1、静态库的扩展名一般为".a"或者".lib";动态库的扩展名一般为".so"或者".dll"。

    2、静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可以独立运行

    3、动态库在编译时不会放到连接的目标程序中,即可执行文件无法单独运行。

    构建示例

    创建新项目cmake02,包含目录如下

    hello.h中的内容

    #ifndef HELLO_H#define HELLO_H void HelloFunc(); #endif

    hello.cpp中的内容

    #include "hello.h"#include using namespace std; void HelloFunc(){    cout<<"Hello World"<

    项目中CMakeLists.txt内容

    PROJECT(HELLO)ADD_SUBDIRECTORY(lib bin)

    lib中CMakeLists.txt内容

    SET(LIBHELLO_SRC hello.cpp)ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

    ADD_LIBRARY

    ADD_LIBRARY(hello SHARED ${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})

    SET_TARGET_PROPERTIES

    这条指令可以用来设置输出的名称,对于动态库,还可以用来指定动态库版本和API版本

    同时构建静态和动态库示例

    SET(LIBHELLO_SRC hello.cpp) ADD_LIBRARY(hello_static STATIC    ${LIBHELLO_SRC}) SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello") SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT$ ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) SET_TARGET_PROPERTIES(hello PROPERTIES OUTPUT_NAME "hello")SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)

    动态库的版本号

    一般动态库都会有一个版本号的关联

    libhello.so.1.2

    libhello.so->libhello.so.1

    libhello.so.1->libhello.so.1.2

    CMakeList.txt插入如下

    SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)

    VERSION指代动态库版本,SOVERSION指代API版本

    安装共享库和头文件

    本例中我们将hello的共享库安装到/lib目录

    将hello.h安装到/include/hello目录

    //文件放到该目录下INSTALL(FILES hello.h DESTINATION include/hello) //二进制,静态库,动态库安装都是用TARGETS//ARCHIVE特指静态库,LIBRATY特指动态库,RUNTIME特指可执行目标二进制INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)

    注意:安装的时候,指定一下路径,放到系统下

    cmake -DCMAKE_INSTALL_PERFIX=/usr ..

    使用外部共享库和头文件

    新建cmake03目录来使用外部共享库和头文件

    main.cpp内容

    #include  int main(){    HelloFunc();}

    解决 :make后头文件找不到的问题

    PS:include 这样是可以的

    关键字:INCLUDE_DIRECTORIES 这条指令可以用来向工程添加多个特定的头文件搜索路径,路径之间用空格分割

    在CMakeLists.txt中加入头文件搜索路径

    INCLUDE_DIRECTORIES(/usr/local/include/hello)

    解决:找到引用的函数问题

    关键字:LINK_DIRCTORIES 添加非标准的共享库搜索路径

    指定第三方库锁在路径,LINK_DIRECTORIES(/home/myproject/libs)

    关键字TARGET_LINK_LIBRARIES 添加需要链接的共享库

    TARGET_LINK_LIBRARIES的时候,只需要给出动态链接库的名字就行了。

    CMakeLists.txt中插入连接共享库,主要要插在executable的后面

    TARGET_LINK_LIBRARIES(hello libhello.so)

    cmake后make

    执行bin目录下的./hello报错

    解决:mv /usr/local/lib/libhello.so /usr/lib64/

    查看main的链接情况

    链接静态库

    TARGET_LINK_LIBRARIES(hello libhello.a)

    特殊的环境变量CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH

    注意:这两个是环境变量而不是cmake变量,可以在linux的bash中进行设置

    在上面例子中使用了绝对路径INCLUDE_DIRECTORIES(/usr/include/hello)来指明include路径的位置

    我们还可以使用环境变量export CMAKE_INCLUDE_PATH=/usr/local/include/hello

    生产debug版本的方法:

    cmake .. -DCMAKE_BUILD_TYPE=debug

    以上是"C++中Cmake的构建静态库和动态库是什么"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

    动态 静态 文件 内容 路径 版本 目录 变量 名字 链接 C++ 关键 关键字 环境 目标 篇文章 搜索 编译 二进制 同时 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 带客户端的服务器办公软件 中国台湾文档软件开发价格 归结推理软件开发 非法吸收公众存款软件开发 软件开发乙方的权利和义务 苹果快速调数据库 网络安全隔离卡及其组成 网络安全特定领域认证与培训 江西软件开发大概多少价格 灵钰网络技术洛阳有限公司 sql数据库备份默认位置 数据库系统第二章课后习题 网络安全防护体系的核心是 数据库创建符合条件的内容 数据库数据频繁操作 数据库实验二创建学生课程数据库 销售分布式实时数据库哪家好 最常用的网络安全监管措施是什么 陕西创新网络技术服务单价 empower 数据库 项目 中国联通网络技术研究院陈燕芬 数据库活动图 网络安全对称加密算法 网络安全法制 观后感 设计软件开发合同 山东广赢网络技术有限公司 软件开发人业匹配 信息老是给我发送网络安全 昭通互联网科技贵不贵 网络安全舆情关注工作
    0