《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件【转】...

本文转载自:

五、静态库与动态库构建

读者云,太能罗唆了,一个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
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 参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。

C/C++ 静态链接库(.a) 与 动态链接库(.so)库

Linux C 静态库(.a) 与 动态库(.so)的详解

(四)、添加静态库

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

ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})

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

你可能感兴趣的:(c++,开发语言)