CMakeLists编译静态库与动态库

发布时间 2023-07-11 11:42:27作者: 阿风小子

一、编写一个库
编写一个计算整数和浮点数之和的库函数mymath,文件目录

 

mymath.h

#ifndef MYMATH_H
#define MYMATH_H
 
int add(int, int);
double add(double, double);
 
#endif
mymath.cc

#include "mymath.h"
 
int add(int a, int b){
    return a+b;
}
 
double add(double a, double b){
    return a+b;
}
主文件mymathApp.cc

#include <iostream>
#include "mymath.h"
 
using namespace std;
 
int main(int argc, char const *argv[])
{
    double a = add(1.1, 1.1);
    int b = add(1, 1);
    cout << "1.1加1.1等于" << a <<endl;
    cout << "1加1等于" << b <<endl;
    return 0;
}
二、编译静态库
cmake_minimum_required(VERSION 3.0)
 
project(Installation VERSION 1.0)
 
# 如果想生成静态库,使用下面的语句
 
add_library(mymath mymath.cc)
target_include_directories(mymath PUBLIC ${CMAKE_SOURCE_DIR}/include)
 
 
# 生成可执行文件
add_executable(mymathapp mymathApp.cc)
target_link_libraries(mymathapp mymath)
target_include_directories(mymathapp PRIVATE ${CMAKE_SOURCE_DIR}/include)
三、编译动态库
cmake_minimum_required(VERSION 3.0)
project(Installation VERSION 1.0)
 
# 如果想生成动态库,使用下面的语句
add_library(mymath SHARED mymath.cc)
target_include_directories(mymath PRIVATE  ${CMAKE_SOURCE_DIR}/include)
set_target_properties(mymath PROPERTIES PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/mymath.h)
 
# 生成可执行文件
add_executable(mymathapp mymathApp.cc)
target_link_libraries(mymathapp mymath)
target_include_directories(mymathapp PRIVATE ${CMAKE_SOURCE_DIR}/include)
四、同时编译静态库与动态库
同样使用上面的指令,我们在支持动态库的基础上再为工程添加一个静态库,按照一般的习
惯,静态库名字跟动态库名字应该是一致的,只不过后缀是.a 罢了。

下面我们用这个指令再来添加静态库:

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

如果我们把上面的 mymath 修改为 mymath _static:

add_library(mymath_static STATIC mymath.cc)
就可以构建一个 libmymath_static.a 的静态库了。
这种结果显示不是我们想要的,我们需要的是名字相同的静态库和动态库,因为 target 名
称是唯一的,所以,我们肯定不能通过 ADD_LIBRARY 指令来实现了。这时候我们需要用到
另外一个指令:
SET_TARGET_PROPERTIES,其基本语法是:

SET_TARGET_PROPERTIES(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
这条指令可以用来设置输出的名称,对于动态库,还可以用来指定动态库版本和 API 版本

cmake_minimum_required(VERSION 3.0)
project(Installation VERSION 1.0)
 
# 如果想生成动态库,使用下面的语句
add_library(mymath SHARED mymath.cc)
 
#VERSION 指代动态库版本,SOVERSION 指代 API 版本
SET_TARGET_PROPERTIES(mymath PROPERTIES VERSION 1.2 SOVERSION 1)
 
target_include_directories(mymath PRIVATE  ${CMAKE_SOURCE_DIR}/include)
 
set_target_properties(mymath PROPERTIES PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/mymath.h)
 
# 如果同时要生成静态库
add_library(mymath_static STATIC mymath.cc)
SET_TARGET_PROPERTIES(mymath_static PROPERTIES OUTPUT_NAME "mymath")
 
# 生成可执行文件
add_executable(mymathapp mymathApp.cc)
target_link_libraries(mymathapp mymath)
target_include_directories(mymathapp PRIVATE  ${CMAKE_SOURCE_DIR}/include)
参考:

http://file.ncnynl.com/ros/CMake%20Practice.pdf

CMake之install方法的使用 - 知乎