0%

cmake 迷你系列(五)配置导出 API

引言

提供的 api 时候需要根据不同的场景,制定不同的导出策略也就是函数的可见性。cmake 实现起来也十分简单。

再探 utils

我们看下 utils 的头文件:

1
2
3
4
5
6
#ifndef TEST_UTILS_H
#define TEST_UTILS_H

int add(int,int);

#endif //TEST_UTILS_H

这里只声明了一个函数,现在我们需要根据不同的场合配置 add 函数的可见性。我们创建另外一个头文件 api.h 并定义以下宏:

1
2
3
4
5
6
7
8
9
10
11
#ifndef TEST_API_H
#define TEST_API_H

#define DEFAULT __attribute__((visibility("default")))
#define HIDDEN __attribute__((visibility("hidden")))

#if !defined(API)
#define API DEFAULT
#endif

#endif //TEST_API_H

然后在我们的 utils.h 头文件中引入该头文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef TEST_UTILS_H
#define TEST_UTILS_H

#include "api.h"

API int add(int, int);

inline static int add_online(int a, int b)
{
return a + b;
}

#endif //TEST_UTILS_H

其中为 add 函数添加 API 宏,然后我们添加另一个内联函数 add_online,该函数只是为了概述一下内联函数的用法,也就是说在头文件里内联函数必须要声明为 static 的,一是为了防止函数重复定义,一是如果不声明为 static,utils.c 就必须再声明一次该函数,同时必须去掉 inline 关键字。否则会提示找不到符号。回归正题,我们需要在根路径中的 CMakeLists.txt 文件中添加 API 宏的导出策略:

1
target_compile_definitions(utils-share PUBLIC -DAPI=DEFAULT)

我们可以通过配置 -DAPI=DEFAULT 或者 -DAPI=HIDDEN 以决定不同的导出策略。当然,该功能只限定于动态库,静态库直接编译到源码中,所以制定导出策略也没有太大的意义。