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

本文详细介绍了如何使用CMake构建静态库和动态库,包括创建共享库和静态库的步骤,如何设置库的输出路径,以及动态库版本号的设定。同时,文章还讲解了如何添加头文件搜索路径,解决找不到头文件的问题,以及如何链接外部库,包括静态库和动态库的链接方法。最后,文章讨论了CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH环境变量的作用,并指出它们在特定情况下的使用方式。
摘要由CSDN通过智能技术生成

本文转载自:

五、静态库与动态库构建

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

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

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

(四)、添加静态库

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

ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小庄老师

要是觉得不错,就给我点支持吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值