跨平台动态库导出符号最佳实现

跨平台动态库导出符号最佳实现

定义良好的EXPORTED宏实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#pragma once

#if defined _WIN32 || defined __CYGWIN__
// Win32或者Cygwin
#ifdef MYLIB_STATIC_DEFINE
// 静态库
#define MYLIB_EXPORT
#define MYLIB_NO_EXPORT
#elif
// 动态库
#ifdef MYLIB_EXPORTS
// 库导出
#ifdef __GNUC__
#define MYLIB_EXPORT __attribute__ ((dllexport))
#else
#define MYLIB_EXPORT __declspec(dllexport)
#endif
#else
// 用户库导入
#ifdef __GNUC__
#define MYLIB_EXPORT __attribute__ ((dllimport))
#else
#define MYLIB_EXPORT __declspec(dllimport)
#endif
#endif
#endif
#else
// Linux
#ifdef MYLIB_STATIC_DEFINE
// 静态库
#define MYLIB_EXPORT
#define MYLIB_NO_EXPORT
#else
// 动态库
#ifdef MYLIB_EXPORTS
#define MYLIB_EXPORT __attribute__ ((visibility ("default")))
#define MYLIB_NO_EXPORT __attribute__ ((visibility ("hidden")))
#else
#define MYLIB_EXPORT
#define MYLIB_NO_EXPORT
#endif
#endif
#endif

CMake脚本示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# CMakeLists.txt

# 设置cmake版本需求
cmake_minimum_required(VERSION 3.4)

set (PROJECT_VERSION "1.0")

# 定义项目名称并设定版本号,cmake自动解析MAJOR MINOR PATCH TWEAK[1]
project(mylib VERSION ${PROJECT_VERSION})

# 定义库名称
add_library(mylib SHARED)

# 添加源码
target_sources(mylib
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
)

# 设置库版本属性
set_target_properties(mylib
PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION}
)

# 设置宏定义导出符号
target_compile_definitions(mylib PRIVATE mylib_EXPORT)

# 设置编译器选项
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
# G++ 默认所有符号隐藏[2]
target_compile_options(mylib PRIVATE -Wall -Wextra "-fvisibility=hidden")
endif()

参考


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!