引言
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 和动态库的开发技巧。