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