C++ Cmake学习(四):构建静态库和动态库

目录

静态库和动态库的区别

构建示例

ADD_LIBRARY

同时构建静态和动态库

SET_TARGET_PROPERTIES

动态库的版本号

安装共享库和头文件

使用外部共享库和头文件

解决 :make后头文件找不到的问题

解决:找到引用的函数问题

特殊的环境变量CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH


 学习通道:从零开始详细介绍CMake

Cmake下载地址:下载地址

Cmake官网:官网


任务:

1、建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc向终端输出Hello World字符串

2、安装头文件与共享库

静态库和动态库的区别

1、静态库的扩展名一般为".a"或者".lib";动态库的扩展名一般为".so"或者".dll"。

2、静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可以独立运行

3、动态库在编译时不会放到连接的目标程序中,即可执行文件无法单独运行。

构建示例

创建新项目cmake02,包含目录如下

hello.h中的内容

#ifndef HELLO_H
#define HELLO_H

void HelloFunc();

#endif

 hello.cpp中的内容

#include "hello.h"
#include <iostream>
using namespace std;

void HelloFunc()
{
    cout<<"Hello World"<<endl;
}

项目中CMakeLists.txt内容

PROJECT(HELLO)
ADD_SUBDIRECTORY(lib bin)

lib中CMakeLists.txt内容

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

ADD_LIBRARY

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

hello:就是正常的库名,生成的名字前面会加上lib,最终产生的文件是libhello.so

SHARED,动态库STATIC,静态库

${LIBHELLO_SRC}:源文件

同时构建静态和动态库

//如果用这种方式,只会构建一个动态库,不会构建出静态库,虽然静态库的后缀是.a

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})

//修改静态库的名字,这样是可以的,但是我们往往希望他们的名字是相同的,只是后缀不同而已

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})

SET_TARGET_PROPERTIES

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

同时构建静态和动态库示例

SET(LIBHELLO_SRC hello.cpp)

ADD_LIBRARY(hello_static STATIC	${LIBHELLO_SRC})

SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")

SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT$

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

SET_TARGET_PROPERTIES(hello PROPERTIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)

动态库的版本号

一般动态库都会有一个版本号的关联

libhello.so.1.2

libhello.so->libhello.so.1

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

CMakeList.txt插入如下

SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)

 VERSION指代动态库版本,SOVERSION指代API版本

安装共享库和头文件

本例中我们将hello的共享库安装到<prefix>/lib目录

将hello.h安装到<prefix>/include/hello目录

//文件放到该目录下
INSTALL(FILES hello.h DESTINATION include/hello)

//二进制,静态库,动态库安装都是用TARGETS
//ARCHIVE特指静态库,LIBRATY特指动态库,RUNTIME特指可执行目标二进制
INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)

注意:安装的时候,指定一下路径,放到系统下

cmake -DCMAKE_INSTALL_PERFIX=/usr ..

使用外部共享库和头文件

新建cmake03目录来使用外部共享库和头文件

main.cpp内容

#include <hello.h>

int main()
{
    HelloFunc();
}

解决 :make后头文件找不到的问题

 PS:include <hello/hello.h>这样是可以的

关键字:INCLUDE_DIRECTORIES 这条指令可以用来向工程添加多个特定的头文件搜索路径,路径之间用空格分割

在CMakeLists.txt中加入头文件搜索路径

INCLUDE_DIRECTORIES(/usr/local/include/hello)

解决:找到引用的函数问题

关键字:LINK_DIRCTORIES 添加非标准的共享库搜索路径

指定第三方库锁在路径,LINK_DIRECTORIES(/home/myproject/libs)

关键字:TARGET_LINK_LIBRARIES 添加需要链接的共享库

TARGET_LINK_LIBRARIES的时候,只需要给出动态链接库的名字就行了。

在CMakeLists.txt中插入连接共享库,主要要插在executable的后面

TARGET_LINK_LIBRARIES(hello libhello.so)

 cmake后make

执行bin目录下的./hello报错

 解决:mv /usr/local/lib/libhello.so /usr/lib64/

 查看main的链接情况

链接静态库

TARGET_LINK_LIBRARIES(hello libhello.a) 

特殊的环境变量CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH

注意:这两个是环境变量而不是cmake变量,可以在linux的bash中进行设置

在上面例子中使用了绝对路径INCLUDE_DIRECTORIES(/usr/include/hello)来指明include路径的位置

我们还可以使用环境变量export CMAKE_INCLUDE_PATH=/usr/local/include/hello

生产debug版本的方法:

cmake .. -DCMAKE_BUILD_TYPE=debug

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CMake中,你可以使用add_library命令来设置生成动态静态。add_library命令用于创建一个新的目标,并指定的类型。 要生成动态,可以将add_library命令的第一个参数设置为的名称,然后将第二个参数设置为SHARED。例如: ```cmake add_library(mylib SHARED source1.cpp source2.cpp) ``` 上面的例子中,我们创建了一个名为mylib的动态目标,并将源文件source1.cpp和source2.cpp添加到该目标中。生成的动态文件将具有与平台相关的扩展名(如.so、.dll或.dylib)。 要生成静态,可以将add_library命令的第一个参数设置为的名称,然后将第二个参数设置为STATIC。例如: ```cmake add_library(mylib STATIC source1.cpp source2.cpp) ``` 上面的例子中,我们创建了一个名为mylib的静态目标,并将源文件source1.cpp和source2.cpp添加到该目标中。生成的静态文件将具有与平台相关的扩展名(如.a、.lib或.a)。 默认情况下,CMake将根据操作系统和构建配置(如Release或Debug)来决定使用动态还是静态。但你也可以使用set_target_properties命令来显式地指定目标生成的类型。例如: ```cmake set_target_properties(mylib PROPERTIES LINKER_LANGUAGE CXX) ``` 上面的例子中,我们将目标mylib的链接器语言设置为C++,这将影响生成的的类型。 总之,通过在add_library命令中使用SHARED或STATIC作为第二个参数,可以设置生成动态静态。你也可以使用set_target_properties命令来显式指定的类型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

静·无羡

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值