• CMake--静态库与动态库构建


    小结内容

    • 建立一个静态库和动态库,提供 HelloFunc 函数供其他程序编程使用, HelloFunc 向终端输出Hello World 字符串。
    • 安装头文件与共享库。

    1.代码与CMakeList.txt文件编写

    首先建立 t3 目录,用于存放本节涉及到的工程
    t3目录下创建lib目录用来存代码

    在 t3 目录下建立 CMakeLists.txt ,

    PROJECT(HELLOLIB)
    ADD_SUBDIRECTORY(lib)
    #SET(LIBRARY_OUTPUT_PATH < 路径 >) #指定库的生成位置。
    

    在 lib 目录下建立两个源文件 hello.c 与 hello.h
    hello.c 内容如下:

    #include "hello.h"
    void HelloFunc()
    {
        printf("Hello Worldn");
    }
    

    hello.h 内容如下:

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

    在 lib 目录下建立 CMakeLists.tx

    SET(LIBHELLO_SRC hello.c)
    ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})		#添加动态库
    #ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC}) 		#添加静态库
    #ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})	
    #SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")   	#更改静态库输出名字
    #GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME)		#获取静态库输出名字
    #MESSAGE(STATUS “This is the hello_static OUTPUT_NAME:”${OUTPUT_VALUE})
    #SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)		#设置动态库版本号
    #INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) #安装静态库与动态库
    #INSTALL(FILES hello.h DESTINATION include/hello) #安装头文件
    

    2.编译动态库与静态库:

    仍然采用 out-of-source 编译的方式,按照习惯,我们建立一个 build 目录,在 build 目录中

    $cmake ..
    $make
    

    可以在 lib 目录得到一个 libhello.so

    3.指令解析

    ADD_LIBRARY

    ADD_LIBRARY(libname [SHARED|STATIC|MODULE]
    [EXCLUDE_FROM_ALL]
    source1 source2 ... sourceN)
    

    1)第一个参数为库的名字,不需要写全 libhello.so ,只需要填写 hello 即可, cmake 系统会自动为你生成libhello.X。
    2)类型有三种 :

    • SHARED ,动态库
    • STATIC ,静态库
    • MODULE ,在使用 dyld 的系统有效,如果不支持 dyld ,则被当作 SHARED 对待。

    3)EXCLUDE_FROM_ALL 参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。

    SET_TARGET_PROPERTIE

    SET_TARGET_PROPERTIES(target1 target2 ...
    PROPERTIES prop1 value1
    prop2 value2 ...)
    

    1)这条指令可以用来设置输出的名称,对于动态库,还可以用来指定动态库版本和 API 版本。
    与他对应的指令是:

    GET_TARGET_PROPERTY(VAR target property)
    

    来获取target属性。

    2)这条指令同样可以设置动态库版本号

    SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
    
    • VERSION 指代动态库版本
    • SOVERSION 指代 API 版本

    将上述指令加入 lib/CMakeLists.txt 中,重新构建看看结果。
    在 build/lib 目录会生成:
    libhello.so.1.2
    libhello.so.1->libhello.so.1.2
    libhello.so ->libhello.so.1

    install

    将 libhello.a, libhello.so.x 以及 hello.h 安装到系统目录,才能真正让其他人开发使用,在本例中利用上一节了解到的 INSTALL 指令,我们向 lib/CMakeLists.txt 中添加如下指令:

    INSTALL(TARGETS hello hello_static
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib)
    INSTALL(FILES hello.h DESTINATION include/hello)
    

    通过终端执行:

    $cmake -DCMAKE_INSTALL_PREFIX=/usr ..
    $make
    $sudo make install
    

    我们就可以将头文件和共享库安装到系统目录 /usr/lib 和 /usr/include/hello 中了。

  • 相关阅读:
    SQL Server游标的使用【转】
    Window.Open参数、返回值
    .NET中class和struct的区别
    MVC中的几个问题汇总
    委托
    Hadoop集群环境搭建
    数学问题
    Ubuntu命令模式基础
    递归与分治-合并排序、快速排序以及循环赛问题
    Mongodb基础
  • 原文地址:https://www.cnblogs.com/narjaja/p/9533169.html
Copyright © 2020-2023  润新知