Cmake Practice(三)

转载自:https://blog.csdn.net/xuewend/article/details/78259737 感谢作者:fishmov 请支持作者,查看原文

上一章

五,静态库与动态库构建 
本节的任务:

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

一,准备工作: 
在/leran-cmake/目录建立practice3目录,用于存放本节涉及到的工程

mkdir project3
cd project3

二 在 ./practice3 下,建立共享库

  mkdir lib

在 project3 目录下建立 CMakeLists.txt,内容如下:

PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)

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

#include “hello.h”
void HelloFunc()
{
    printf(“Hello World\n”);
}

hello.h 内容如下:

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

在./project3/lib 创建 CMakeLists.txt

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

三,编译共享库: 
还是在build目录中进行编译

cd ../../build/
rm -rf *       //删除上一个工程的编译文件
cmake ../project3/
make

这时,你就可以在 lib 目录得到一个 libhello.so,这就是我们期望的共享库。 
如果你要指定 libhello.so 生成的位置,可以通过在主工程文件./project3/CMakeLists.txt 中修改 ADD_SUBDIRECTORY(lib)指令来指定一个编译输出位置或者在 ./project3/lib/CMakeLists.txt 中添加SET(LIBRARY_OUTPUT_PATH <路径>)来指定一个新的位置。

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

你不需要写全 libhello.so,只需要填写 hello 即可,cmake 系统会自动为你生成libhello.X 
类型有三种: 
SHARED,动态库 
STATIC,静态库 
MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。

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

四,添加静态库: 
同样使用上面的指令,我们在支持动态库的基础上再为工程添加一个静态库,按照一般的习惯,静态库名字跟动态库名字应该是一致的,只不过后缀是.a 罢了。

下面我们用这个指令再来添加静态库:。./project3/lib/CMakeLists.txt

ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})

然后再在 build 目录进行外部编译,我们会发现,静态库根本没有被构建,仍然只生成了一个动态库。因为 hello 作为一个 target 是不能重名的,所以,静态库构建指令无效。

如果我们把上面的 hello 修改为 hello_static: 
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC}) 
就可以构建一个 libhello_static.a 的静态库了。

这种结果显示不是我们想要的,我们需要的是名字相同的静态库和动态库,因为 target 名称是唯一的,所以,我们肯定不能通过 ADD_LIBRARY 指令来实现了。这时候我们需要用到另外一个指令:

SET_TARGET_PROPERTIES,其基本语法是:

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

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

在本例中,我们需要作的是向 ./project3/lib/CMakeLists.txt 中添加:

SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")

这样,我们就可以同时得到 libhello.so/libhello.a 两个库了。 
目前lib/CMakeLists.txt的内容如下:

SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello_shared SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES(hello_shared PROPERTIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")

五,动态库版本号 
按照规则,动态库是应该包含一个版本号的,我们可以看一下系统的动态库,一般情况是:

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

为了实现动态库版本号,我们仍然需要使用 SET_TARGET_PROPERTIES 指令。 
具体使用方法如下:

SET_TARGET_PROPERTIES(hello_shared 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

六,安装共享库和头文件 
以上面的例子,我们需要将 libhello.a, libhello.so.x 以及 hello.h 安装到系统目录,才能真正让其他人开发使用,在本例中我们将 hello 的共享库安装到/lib目录,将 hello.h 安装到/include/hello 目录。

利用上一节了解到的 INSTALL 指令,我们向 ./project3/lib/CMakeLists.txt 中添加如下指令:

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

DESTINATION==》 指路经 接传进的参数 路径 /usr/lib      /usr/include/hello    目录没有会自动创建

注意,静态库要使用 ARCHIVE 关键字 在./build 下

cmake -DCMAKE_INSTALL_PREFIX=/usr ../project3
make
sudo make install  //需要权限,否则会失败

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

七,小结: 
本小节,我们谈到了: 
如何通过 ADD_LIBRARY 指令构建动态库和静态库。 
如何通过 SET_TARGET_PROPERTIES 同时构建同名的动态库和静态库。 
如何通过 SET_TARGET_PROPERTIES 控制动态库版本 
最终使用上一节谈到的 INSTALL 指令来安装头文件和动态、静态库。 
在下一节,我们需要编写另一个高级一点的 Hello World 来演示怎么使用我们已经构建的 
构建的共享库 libhello 和外部头文件。

八:最终编译文件

./project3/lib/CMakeLists.txt

SET(LIB_SRC hello.c)

ADD_LIBRARY(hello_shared SHARED ${LIB_SRC})
ADD_LIBRARY(hello_static STATIC ${LIB_SRC})

SET_TARGET_PROPERTIES(hello_shared PROPERTIES VERSION 1.2 SOVERSION 1)


SET_TARGET_PROPERTIES(hello_shared PROPERTIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")

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

./project3/CMakeLists.txt


PROJECT("HELLO")

ADD_SUBDIRECTORY(lib)

下一章
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值