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
在系统环境中指定[cmake]的位置(可选)
# 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