快捷搜索: 王者荣耀 脱发

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)

参考:

经验分享 程序员 微信小程序 职场和发展