c++使用CMake在Windows和Ubuntu上编译生成共享库(DLL)的技术

1.背景:

在跨平台软件开发中,常常需要生成共享库(DLL)以实现代码的重用和模块化。CMake是一个跨平台的构建系统,可以生成本地构建脚本,用于不同平台上的编译。本方案旨在详细描述如何在Windows和Ubuntu操作系统上使用CMake编译DLL文件的过程。

2.目标:

  1. 在Windows上生成DLL文件
  2. 在Ubuntu上生成共享库文件
  3. 确保生成的库可以被其他项目引用和使用

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指令如下:

  1. cmake -version: 显示当前的 CMake 版本。
  2. cmake .:在当前目录下生成构建文件。
  3. cmake -G"generator-name": 生成指定生成器的构建文件。例如:"Visual Studio 16 2019" 用于生成 Visual Studio 2019 的工程文件。
  4. cmake -DCMAKE_BUILD_TYPE=Release .:指定构建类型为天发布。
  5. cmake -DCMAKE_INSTALL_PREFIX=/path/to/install: 指定安装目录路径。
  6. cmake --build .:编译源代码。
  7. cmake --build . --target install: 编译源代码并安装。
  8. cmake --build . --config Release:指定构建配置为发布。
  9. cmake --build . --target clean: 清理项目构建。
  10. 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

 

posted @   骑着蚂蚁快跑  阅读(542)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示