揭秘CMake:轻松生成so动态库,掌握符号导出技巧

引言
CMake 是一个跨平台的安装(编译)工具,可以用于跨平台的软件开发。在 Linux 系统中,使用 CMake 可以方便地生成动态库(如 .so 文件)。本文将详细介绍如何使用 CMake 生成 so 动态库,并介绍符号导出的技巧。
CMake 简介
CMake 是一个跨平台的安装(编译)工具,可以用于跨平台的软件开发。它是一个开源项目,由 Kitware 公司维护。CMake 的主要功能是:
自动化编译过程
管理项目依赖
支持多种编译器和平台
生成 so 动态库
下面是一个简单的示例,展示如何使用 CMake 生成 so 动态库。
1. 创建项目目录
首先,创建一个项目目录,例如
my_project
。
mkdir my_project
cd my_project
2. 创建 CMakeLists.txt 文件
在
my_project
目录下创建一个名为
CMakeLists.txt
的文件。
cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 设置 C++ 版本
set(CMAKE_CXX_STANDARD 11)

# 添加可执行文件
add_executable(MyProject main.cpp)

# 添加动态库
add_library(MyProjectLib SHARED lib.cpp)

# 链接库
target_link_libraries(MyProjectLib MyProject)
3. 创建源文件
在
my_project
目录下创建以下文件:
main.cpp
:主程序文件。
lib.cpp
:动态库源文件。
main.cpp
:
#include
#include “MyProjectLib.h”

int main() {
std::cout << "Hello, World!" << std::endl; MyProjectLib::sayHello(); return 0; } lib.cpp : #include "MyProjectLib.h" void MyProjectLib::sayHello() { std::cout << "Hello from MyProjectLib!" << std::endl; } 4. 编译项目 在项目目录下运行以下命令编译项目: mkdir build cd build cmake .. make 编译完成后,会在 build 目录下生成可执行文件 MyProject 和动态库 libMyProjectLib.so 。 符号导出技巧 在生成动态库时,有时需要控制符号的导出。以下是一些常用的技巧: 1. 使用 __attribute__((visibility("default"))) 属性 在 C++ 中,可以使用 __attribute__((visibility("default"))) 属性将符号标记为默认可见。这意味着该符号将被导出。 __attribute__((visibility("default"))) void sayHello() { std::cout << "Hello from MyProjectLib!" << std::endl; } 2. 使用 __attribute__((visibility("hidden"))) 属性 在 C++ 中,可以使用 __attribute__((visibility("hidden"))) 属性将符号标记为隐藏。这意味着该符号不会被导出。 __attribute__((visibility("hidden"))) void sayNothing() { // 不输出任何内容 } 3. 使用 dllexport 和 dllimport 关键字 在 Windows 平台上,可以使用 dllexport 和 dllimport 关键字分别标记导出和导入的符号。 #ifdef _WIN32 #ifdef DLL_EXPORT #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif #else #define DLL_API #endif DLL_API void sayHello() { std::cout << "Hello from MyProjectLib!" << std::endl; } 总结 本文介绍了如何使用 CMake 生成 so 动态库,并介绍了一些符号导出的技巧。通过学习本文,读者可以更好地掌握 CMake 和动态库的开发技巧。