温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2022-03-18 11:25:09 来源:亿速云 阅读:543 作者:小新 栏目:开发技术

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

    静态库和动态库的区别

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

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

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

    构建示例

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

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

    hello.h中的内容

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

     hello.cpp中的内容

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

    项目中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}:源文件

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

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

    同时构建静态和动态库

    //如果用这种方式,只会构建一个动态库,不会构建出静态库,虽然静态库的后缀是.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)

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

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

    动态库的版本号

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

    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的共享库安装到<prefix>/lib目录

    将hello.h安装到<prefix>/include/hello目录

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

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

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

    cmake -DCMAKE_INSTALL_PERFIX=/usr ..

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

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

    使用外部共享库和头文件

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

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

    main.cpp内容

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

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

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

     PS:include 这样是可以的

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

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

    INCLUDE_DIRECTORIES(/usr/local/include/hello)

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

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

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

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

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

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

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

    TARGET_LINK_LIBRARIES(hello libhello.so)

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

     cmake后make

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

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

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

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

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

     查看main的链接情况

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

    链接静态库

    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的构建静态库和动态库是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI