CMakeLists编译静态库与动态库
一、编写一个库
编写一个计算整数和浮点数之和的库函数mymath,文件目录
mymath.h
#ifndef MYMATH_H #define MYMATH_H int add(int, int); double add(double, double); #endif
#include "mymath.h" int add(int a, int b){ return a+b; } double add(double a, double b){ return a+b; }
主文件
#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)
参考: