当前位置: 首页 > news >正文

使用 CMake 创建和调用动态库在 Windows 和 Ubuntu上的差异

使用 CMake 创建和调用动态库在 Windows 和 Ubuntu上的差异

确实,您指出的非常正确。在 Windows 平台上,当使用 CMake 配置和构建项目时,应当链接到 DLL 的导入库(.lib 文件),而不是直接链接到 .dll 文件。这是因为 .lib 文件包含了必要的符号链接信息,它们在编译时被用来解析 DLL 中的符号,而 .dll 文件则在运行时被加载。我将修正该部分以确保正确性和准确性。

修改后的内容

使用 CMake 在 Windows 和 Ubuntu(代表通用的 Linux 系统)平台上创建和调用动态库,涉及许多相似的步骤,但也有一些关键的环境和工具链差异需要注意。

1. 创建动态库

创建动态库的 CMake 指令在两个平台上基本相同:

add_library(mylibrary SHARED source1.cpp source2.cpp)
Windows:
  • 文件类型与扩展:动态库通常被创建为 .dll 文件,伴随着一个 .lib 文件(导入库),后者包含了需要链接到主可执行文件的符号。
  • 导出符号:需要使用 __declspec(dllexport)__declspec(dllimport) 来显式导出和导入类、函数或变量。
Ubuntu:
  • 文件类型与扩展:动态库被创建为 .so 文件(Shared Object)。
  • 导出符号:Linux 平台通常不需要像 Windows 那样显式定义导入导出符号,编译器默认会导出所有符号。但为了隐藏不需要公开的符号,可能会使用 GCC 的 __attribute__((visibility("default")))__attribute__((visibility("hidden"))) 属性。

2. 链接动态库

链接动态库的 CMake 指令也是相同的,但在 Windows 上需要链接到导入库 .lib 文件,而在 Ubuntu 上直接链接到 .so 文件。

target_link_libraries(myexecutable mylibrary)
Windows:
  • 环境配置:确保 .dll 文件在程序运行时可用,通常通过将其放在可执行文件同目录下或配置系统路径。在编译时,链接到 .lib 文件以解析 DLL 中的符号。
  • 工具链:使用 MSVC 或 MinGW 等工具链,可能需要处理特定的编译器或链接器选项。
Ubuntu:
  • 环境配置:需要设置 LD_LIBRARY_PATH 环境变量或将 .so 文件放在标准的库路径下(如 /usr/lib),以确保运行时库可被找到。
  • 工具链:使用 GCC 或 Clang,通常不需要额外配置导入导出符号,除非进行符号可见性的特殊控制。

3. 示例

假设你正在创建一个名为 mylibrary 的动态库,它包含一个函数 void sayHello()。以下是如何在 CMake 中配置项目:

# CMakeLists.txt for the library
cmake_minimum_required(VERSION 3.10)
project(MyLibrary)# Create a shared library
add_library(mylibrary SHARED sayHello.cpp)# CMakeLists.txt for the executable
cmake_minimum_required(VERSION 3.10)
project(MyExecutable)# Add executable
add_executable(myexecutable main.cpp)# Link the dynamic library (ensure linking to .lib file on Windows)
target_link_libraries(myexecutable mylibrary)
文件 sayHello.cpp (库源文件):
#include <iostream>#if defined(_WIN32) || defined(_WIN64)
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endifextern "C" {
EXPORT void sayHello() {std::cout << "Hello, world!" << std::endl;
}
}
文件 main.cpp (主程序源文件):
extern "C" {
void sayHello();
}int main() {sayHello();return 0;
}

4. 构建和运行

在 Windows 和 Ubuntu 上,你会使用 CMake 和相应的编译器(例如 GCC, Clang, MSVC)来配置、构建和运行项目。关键的步骤相同,但记得在 Windows 上需要处理 DLL 的路径问题,并确保在编译时链接到 .lib 文件,在 Linux 上则可能要设置 LD_LIBRARY_PATH

总结

尽管创建和使用动态库的基本步骤在不同操作系统上相似,具体实现上的差异主要体现在动态库文件的处理、环境配置和平台特定的编译器选项上。理解这些差异可以帮助开发者更有效地跨平台开发和部署软件。


http://www.mrgr.cn/news/33400.html

相关文章:

  • 将Docker中nginx静态资源目录映射到宿主机的某个目录及配置文件映射到宿主机
  • PostgreSQL 开启密码验证插件
  • 光伏数字化全面开启,光伏的未来该何去何从?
  • leetcode268 丢失的数字
  • vue2和vue3的区别详解
  • 代码随想录训练营Day24 | 134. 加油站 - 135. 分发糖果 - 860.柠檬水找零 - 406.根据身高重建队列
  • 消息队列(MQ)消息堆积问题排查与解决思路
  • 华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 6 撤回通知消息
  • RAII技术
  • 点赞系统实现
  • python爬虫中json和xml字符串的xPath和jsonpath过滤语法区别对比
  • 深入浅出Docker
  • Spring_AMQP
  • Linux:进程(四)
  • 内核是如何发送数据包
  • 文档布局内容检测系统源码分享
  • 连续数组问题
  • STL之list
  • c语言-数据类型
  • C++:数组与字符串
  • Git从了解到操作
  • 【homebrew安装】踩坑爬坑教程
  • Renesas R7FA8D1BH (Cortex®-M85) 生成4路PWM
  • 【ArcGIS微课1000例】0123:数据库中要素类批量转为shapefile
  • 数据结构之堆(优先级队列)
  • 2024/9/22周报