接触cmake很多年了,但是从来没自己写一个完整的CMakeLists.txt构建过自己的动态库,因为工作以来动态库我都是用别人开源的,基本没有构建自己动态库的需求。今天需要将一个使用automake构建的老库替换为cmake来构建于是了解了一些相关细节,准备迁移过来。
极简例子
以C语言为例,一个动态库至少要包含两个源文件,一个.c
,一个.h
。为啥?.c
包含函数实现,.h
给别人#include
。源码例子如下:
library.h
#ifndef CSHAREDLIB_LIBRARY_H
#define CSHAREDLIB_LIBRARY_H
void hello(void);
#endif //CSHAREDLIB_LIBRARY_H
library.c
#include "library.h"
#include <stdio.h>
void hello(void)
{
printf("Hello, World!\n");
}
CMakeLists.txt
#指定cmake最低版本要求,因为可能这个CMakeLists.txt中引用的特性,内置函数,语法是特定版本才开始引入的
cmake_minimum_required(VERSION 3.22)
project(MyShared)
#构建动态库的关键一句,其中第二个参数SHARED是关键字,表示生成动态库,也可以是STATIC或者省略,表示生成静态库(.a)。
add_library(MyShared SHARED library.c library.h)
执行cmake生成Makefile,良好的习惯是把构建过程中的中间文件放在一个单独的目录,不和源码目录混在一起:
mkdir build
cd build
cmake ..
make
于是动态库libMyShared.so
被编译出来了。这样就完了吗?如果你是比较狂野的人,这样确实完了。