Linux下使用CMake编译生成CPP动态库与静态库

1.安装CMake

ps.本案例使用的是CentOS7(Red Hat 4.8)

#1移除旧版本CMake
yum remove cmake -y
#2安装新版本CMake
yum install cmake -y
#3查看cmake版本
cmake -version
#若输出cmake version x.x.xx.x表示安装成功
#我的是cmake version 2.8.12.2

ps.默认你有编译环境,若你还没有gcc、g++编译环境也不要怕,请执行如下命令配置编译环境及内核文件,你的网络传输速度与该过程耗时成反比

yum install gcc gcc-c++ kernel-devel -y

2.新建目录并编写.h、.cpp和CMakeLists.txt文件

cmn.h头文件内容如下

cmn- ->common公共头文件的意思

//使用预编译宏,防止被重复引入
#ifndef CMN_H
#define CMN_H
void printHello();
#endif
dymclib.cpp文件内容如下

dymclib- ->dynamic动态的意思,用它来生成动态库

//输入输出流,输出语句打印流要用到
#include <iostream>
//引入公共头文件,映射该文件的printHello()函数
#include "cmn.h"
//标准命名空间
using namespace std;

void printHello(){
	//该函数只打印一句话,后面要把它编译为动态库文件
	cout<<"Hello! This is a dynamic library!"<<endl;
}
sttclib.cpp文件内容如下

sttclib- ->static静态的意思,用它来生成静态库

//输入输出流
#include <iostream>
//公共头文件
#include "cmn.h"
//标准命名空间
using namespace std;

void printHello(){
	//打印一句话,后面把它编译为静态库文件
	cout<<"Hello! This is a static library!"<<endl;
}
main.cpp程序入口文件内容如下
//引入std标准库
#include <stdlib.h>
//引入公共头以获取调用函数符
#include "cmn.h"

int main(){
	//调用公共头文件中的符号函数,函数的行为取决于链接的哪个库,该库可以后天替换,大概库注入就是这个原理吧
	printHello();
	return EXIT_SUCCESS;
}
CMakeLists.txt文件内容如下
#表示CMake最低版本要求
CMAKE_MINIMUM_REQUIRED(VERSION 3.8)
#表示工程文件名
PROJECT(hello)
#表示包含文件搜索路径
include_directories(${PROJECT_SOURCE_DIR})
#表示生成动态库
ADD_LIBRARY(dymc_lib SHARED dymclib.cpp)
#表示生成静态库
ADD_LIBRARY(sttc_lib STATIC sttclib.cpp)#动态链接
#表示生成可执行文件,将用它来链接动态库
ADD_EXECUTABLE(hello_dymc main.cpp)
#表示生成可执行文件,将用它来链接静态库
ADD_EXECUTABLE(hello_sttc main.cpp)
#将之前生成的dymc_lib动态库链接到hello_dymc可执行程序
TARGET_LINK_LIBRARIES(hello_dymc dymc_lib)
#将之前生成的sttc_lib静态库链接到hello_sttc可执行程序
TARGET_LINK_LIBRARIES(hello_sttc sttc_lib)

注释有些碍眼,来一个没有注释的CMakeLists.txt以飨诸位

CMAKE_MINIMUM_REQUIRED(VERSION 3.8)
PROJECT(hello)
include_directories(${PROJECT_SOURCE_DIR})
ADD_LIBRARY(dymc_lib SHARED dymclib.cpp)
ADD_LIBRARY(sttc_lib STATIC sttclib.cpp)#动态链接
ADD_EXECUTABLE(hello_dymc main.cpp)
ADD_EXECUTABLE(hello_sttc main.cpp)
TARGET_LINK_LIBRARIES(hello_dymc dymc_lib)
TARGET_LINK_LIBRARIES(hello_sttc sttc_lib)

万事具备,只欠cmake、make
建议在当前目录下新建一个temp目录,因为cmake、make过程要生成一些临时文件,创建临时目录以避免源文件被污染(不好挑出来)
在temp目录执行:

cmake ../

执行成功后会生成CMakeCache.txt、CMakeFiles、cmake_install.cmake、Makefile等四个文件,别急,还要敲个命令才算成功!
还是在该目录,执行:

make

执行结束后会生成 hello_sttc、libsttc_lib.a、hello_dymc、libdymc_lib.so等四个文件,其中libsttc_lib.a是静态库文件,libdymc_lib.so是动态库文件,hello_sttc是链接了静态库文件的可执行程序,hello_dymc是链接了动态库文件的可执行程序,因为hello_dymc执行需要动态加载libdymc_lib.so文件,所以libdymc_lib.so被删除或文件名被改动都会造成hello_dymc无法执行!
在当前目录执行以下命令即可查看效果:

#执行链接了动态库的程序
./hello_dymc
#程序将输出打印语句:Hello! This is a dynamic library!
#执行链接了静态库的程序
./hello_sttc
#程序将输出打印语句:Hello! This is a static library!

完结!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值