本文转载自:
五、静态库与动态库构建
读者云,太能罗唆了,一个Hello World就折腾了两个大节。OK,从本节开始,我们不再折腾Hello World了,我们来折腾Hello World的共享库。
本节的任务:
1、建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc向终端输出Hello World字符串。
2、安装头文件与共享库。
(一)、准备工作:
在/backup/cmake目录建立t3目录,用于存放本节涉及到的工程
(二)、建立共享库
cd /backup/cmake/t3
mkdir lib
在t3目录下建立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
在lib目录下建立CMakeLists.txt,内容如下:
SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
(三)、编译共享库
仍然采用 out-of-source 编译的方式,按照习惯,我们建立一个build目录,在build目录中
cmake ..
make
这时,你就可以在lib目录得到一个libhello.so,这就是我们期望的共享库。
如果你要指定libhello.so生成的位置,可以通过在主工程文件CMakeLists.txt中修改ADD_SUBDIRECTORY(lib)指令来指定一个编译输出位置或者在lib/CMakeLists.txt中添加SET(LIBRARY_OUTPUT_PATH <路径>)来指定一个新的位置。这两者的区别我们上一节已经提到了,所以,这里不再赘述,下面,我们解释一下一个新的指令ADD_LIBRARY:
ADD_LIBRARY(libname [SHARED|STATIC|MODULE][EXCLUDE_FROM_ALL]source1 source2 ... sourceN)
你不需要写全libhello.so,只需要填写hello即可,cmake系统会自动为你生成libhello.X。类型有三种:
- SHARED,动态库(扩展名为.so)
- STATIC,静态库(扩展名为.a)
- MODULE,在使用dyld的系统有效,如果不支持dyld,则被当作SHARED对待。
- EXCLUDE_FROM_ALL 参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。
(四)、添加静态库
同样使用上面的指令,我们在支持动态库的基础上再为工程添加一个静态库,按照一般的习惯,静态库名字跟动态库名字应该是一致的,只不过后缀是.a罢了。下面我们用这个指令再来添加静态库:
ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})
然后再在build目录进行外部编译,我们会发现,静态库根本没有被构建,仍然只生成了一个动态库。因为hello作为一个target是不能重名的,所以,静态