c++使用CMake在Windows和Ubuntu上编译生成共享库(DLL)的技术
1.背景:
在跨平台软件开发中,常常需要生成共享库(DLL)以实现代码的重用和模块化。CMake是一个跨平台的构建系统,可以生成本地构建脚本,用于不同平台上的编译。本方案旨在详细描述如何在Windows和Ubuntu操作系统上使用CMake编译DLL文件的过程。
2.目标:
- 在Windows上生成DLL文件
- 在Ubuntu上生成共享库文件
- 确保生成的库可以被其他项目引用和使用
3.项目结构
├── CMakeLists.txt
├── src # 编写具体实现逻辑
│ ├── CMakeLists.txt
│ ├── add.cpp
│ └── add.h
├── test # 单元测试
│ ├── CMakeLists.txt
│ ├── main.cpp
│ └── test.cpp
└── third_party # 引用第三方库
└── gtest
├── googletest
├── CMakeLists.txt
└── ...
项目名称:Cmake.Cpp.Lib.Seed
Cmake.Cpp.Lib.Seed\CMakeLists.txt 内容
# 这行代码指定了使用这个 CMakeLists.txt 文件所需的最低 CMake 版本。版本 3.16 或更高版本的 CMake 必须用于配置该项目。 # 设置最低版本可以确保使用一些新的 CMake 特性和保持项目的兼容性。 cmake_minimum_required(VERSION 3.16) # 这行代码定义了项目的名称。Cpp.Lib.Seed 是项目的名称。 project(Cpp.Lib.Seed) # 这行代码设置了项目的C++标准版本。CMAKE_CXX_STANDARD 被设置为14,这意味着项目将使用C++14标准进行编译。 set(CMAKE_CXX_STANDARD 14) # 这行代码添加了一个子目录,指向 src 目录。 add_subdirectory(src) add_subdirectory(test) add_subdirectory(third_party/gtest)
Cmake.Cpp.Lib.Seed\src\CMakeLists.txt 内容
cmake_minimum_required(VERSION 3.10.2) project(cpp_add) add_definitions(-DADD_EXPORTS) # 定义需要参与编译的源文件 aux_source_directory(. source) # 把源码添加进来参与编译,并生成动态库 add_library(${PROJECT_NAME} SHARED ${source}) # 定义需要暴露的头文件 target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR}) # 设置RUNTIME输出目录 set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
Cmake.Cpp.Lib.Seed\src\add.cpp 内容:
#include "add.h" int add(int a, int b) { return a + b; }
Cmake.Cpp.Lib.Seed\src\add.h内容:
#ifndef ADD_HPP #define ADD_HPP #ifdef _WIN32 #ifdef ADD_EXPORTS #define ADD_API __declspec(dllexport) #else #define ADD_API __declspec(dllimport) #endif #else #define ADD_API __attribute__ ((visibility("default"))) #endif #ifdef __cplusplus #define EXTERN_C extern "C" #else #define EXTERN_C #endif EXTERN_C ADD_API int add(int a, int b); #endif // ADD_HPP
Cmake.Cpp.Lib.Seed\test\CMakeLists.txt
cmake_minimum_required(VERSION 3.16) project(Cpp.Lib.Seed.Test) # 添加头文件目录,确保测试项目能找到cpp_add的头文件 include_directories(${PROJECT_SOURCE_DIR}/../src) # 添加可执行文件 add_executable(${PROJECT_NAME} main.cpp test.cpp) # 链接gtest和cpp_add库 target_link_libraries(${PROJECT_NAME} gtest cpp_add) # 设置RUNTIME输出目录 set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
Cmake.Cpp.Lib.Seed\test\main.cpp
#include "gtest/gtest.h" #include "add.h" int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
Cmake.Cpp.Lib.Seed\test\test.cpp
#include "gtest/gtest.h" #include "add.h" TEST(SuiteName, TestName1) { int expected = 3; int actual = add(1, 2); ASSERT_EQ(expected, actual); } TEST(SuiteName, TestName2) { int expected = 3; int actual = add(1, 3); ASSERT_EQ(4, actual); }
项目地址:下载
4.环境配置
3.1Windows 环境配置
安装 CMake:
从官方网站下载并安装CMake。
我下载的为cmake-3.27.6-windows-x86_64.msi 2.2、双击运行,开始安装,一步步按照提示进行安装,直至安装完成。 2.3、在CMD里面输入cmake,显示如下信息则表示安装成功。
安装 Visual Studio:
安装 Visual Studio 2019 或更高版本,并确保安装了“使用C++的桌面开发”工作负载。
在Windows系统上,常用的Cmake指令如下:
- cmake -version: 显示当前的 CMake 版本。
- cmake .:在当前目录下生成构建文件。
- cmake -G"generator-name": 生成指定生成器的构建文件。例如:"Visual Studio 16 2019" 用于生成 Visual Studio 2019 的工程文件。
- cmake -DCMAKE_BUILD_TYPE=Release .:指定构建类型为天发布。
- cmake -DCMAKE_INSTALL_PREFIX=/path/to/install: 指定安装目录路径。
- cmake --build .:编译源代码。
- cmake --build . --target install: 编译源代码并安装。
- cmake --build . --config Release:指定构建配置为发布。
- cmake --build . --target clean: 清理项目构建。
- cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=YES .:导出编译指令到 compile_commands.json 文件。
3.2Ubuntu 环境配置
安装 CMake:
- 官网下载:下载链接:https://cmake.org/download/
- 也可以使用【命令】下载
-
wget https://github.com/Kitware/CMake/releases/download/v3.26.5/cmake-3.26.5.tar.gz
-
解压并安装
# 1、解压
tar -zxvf cmake-3.26.5.tar.gz
# 2、进入文件
cd cmake-3.26.5
# 3、执行文件并指定安装目录
./bootstrap --prefix=/usr/local/cmake
# 4、开始编译
make
# 5、安装
make install
# 1、打开环境配置文件 vim ~/.bashrc # 2、写入环境 这里是上面指定安装目录的文件地址 export PATH="/usr/local/cmake/bin:$PATH" # 3、激活环境 source ~/.bashrc
检查是否安装成功
# 查看版本 cmake --version # 查看位置 which cmake
5.Ubuntu环境下编译
mkdir build
cd build
cmake ..
make
运行测试 确保在正确的目录中 : 确保你在 build
目录中。
cd ~/Desktop/Cmake.Cpp.Lib.Seed/build
设置 LD_LIBRARY_PATH
并运行测试 : 临时设置 LD_LIBRARY_PATH
,然后运行测试可执行文件。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/Desktop/Cmake.Cpp.Lib.Seed/build/src
./bin/Cpp.Lib.Seed.Test
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器