cmake g++ windows 动态库
时间: 2025-02-16 08:11:10 浏览: 45
### 使用 CMake 和 g++ 在 Windows 上创建动态库
#### 准备工作
为了在 Windows 平台上利用 CMake 和 g++ 创建动态链接库(DLL),需先确认已安装 MinGW 或者 MSYS2 环境,因为这些环境提供了适用于 Windows 的 GNU 编译器集合(GCC)。确保 `gcc` 和 `g++` 命令可以在命令提示符中正常运行。
#### 配置项目结构
建立如下所示的基础文件夹和文件:
- **CMakeLists.txt**: 定义项目的配置以及如何构建目标。
- **src/hello.dll.cpp**: 动态库实现代码。
- **include/hello_dll.h**: 头文件定义接口函数原型。
- **test/test_main.cpp**: 测试程序用于验证 DLL 是否能被正确加载和调用。
#### 编写 CMake 文件
编辑 `CMakeLists.txt` 来指定要生成的目标类型为共享库,并设置必要的属性以便于导出符号。对于 Windows 下的 DLL 构建来说,还需要特别注意区分导入/导出宏定义[^3]。
```cmake
# 设置最低版本需求
cmake_minimum_required(VERSION 3.10)
# 设定工程名称
project(DLLExample VERSION 1.0 LANGUAGES CXX)
# 添加头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 指明源码位置
add_library(hello SHARED src/hello_dll.cpp)
# 对于 Windows, 导入/导出宏处理
if(MSVC OR MINGW)
target_compile_definitions(hello PRIVATE "HELLO_DLL_EXPORTS")
endif()
# 可选:设定输出目录
set_target_properties(hello PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
# 如果有测试应用,则添加可执行文件部分
add_executable(test_app test/test_main.cpp)
target_link_libraries(test_app hello)
```
#### 实现动态库功能
编写简单的 “Hello World” 类型的功能作为示例来展示基本操作。这通常涉及两个主要组件:一个是实际逻辑所在的 `.cpp` 文件;另一个是用来声明 API 接口的 `.h` 文件。
##### hello_dll.h
```c++
#ifndef HELLO_DLL_H_
#define HELLO_DLL_H_
#ifdef WIN32
#ifdef HELLO_DLL_EXPORTS
#define HELLO_API __declspec(dllexport)
#else
#define HELLO_API __declspec(dllimport)
#endif
#else
#define HELLO_API
#endif
extern "C" {
HELLO_API void say_hello();
}
#endif // !HELLO_DLL_H_
```
##### hello_dll.cpp
```cpp
#include <iostream>
#include "../include/hello_dll.h"
void say_hello() {
std::cout << "Hello from DLL!" << std::endl;
}
```
#### 编写测试应用程序
最后一步是创建一个小的应用程序去检验新创建的 DLL 能否按预期工作。
##### test_main.cpp
```cpp
#include "../include/hello_dll.h"
int main(int argc, char* argv[]) {
say_hello(); // 应该会打印 Hello from DLL!
return 0;
}
```
#### 执行构建过程
完成上述准备工作之后,在终端窗口内导航到包含 `CMakeLists.txt` 的根目录下,按照下面指令依次执行以启动整个流程:
1. 创建一个新的子目录用来放置所有的中间产物 (`mkdir build && cd build`)
2. 运行 CMake 工具初始化项目并生成 Makefile 或其他所需脚本(`cmake .. -G "MinGW Makefiles"`).
3. 开始编译(`mingw32-make`)或使用更现代的方式(`cmake --build .`).
成功完成后应该会在对应的输出目录找到生成好的 `.dll`,`.exe` 文件以及其他关联资源。
阅读全文
相关推荐


















