使用 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.xdnf.cn/news/1542279.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Godot4.3】点数据简易表示法和Point2D

概述 在构造多点路径时我们会用到PackedVector2Array&#xff0c;并使用Vector2()来构造点。在手动创建多点数据时&#xff0c;这种写法其实很难看&#xff0c;有大量重复的Vector2()&#xff0c;比如下面这样&#xff1a; var points [Vector2(100,100),Vector2(200,200),V…

[Python]二、Python基础数据科学库(1)

F:\BaiduNetdiskDownload\2023人工智能开发学习路线图\2、机器学习核心技术\1、零基础快速入门机器学习 1.机器学习概述 1.1 人工智能概述 1.1.1 人工智能与机器学习、深度学习 1956年-达特茅斯会议-人工智能的起点 人工智能和机器学习、深度学习的关系: 1. 机器学习…

软考(9.22)

1 在浏览器的地址栏中输入xxxyftp.abc.can.cn&#xff0c;在该URL中( )是要访问的主机名。 A.xxxyftp B.abc C.can D.cn 协议://主机名.域名.域名后缀或IP地址(:端口号)/目录/文件名。 本题xxxyftp是主机名&#xff0c;选择A选项。 2 假设磁盘块与缓冲区大小相同&#xff0c;…

Django基础-创建新项目,各文件作用

学习Django的前置知识&#xff1a; python基本语法&#xff1a;需要掌握Python中的变量、循环、条件判断、函数等基本概念。面向对象编程&#xff08;OOP&#xff09;&#xff1a;Django的核心架构基于面向对象编程&#xff0c;许多功能&#xff08;如模型和视图&#xff09;依…

【无人机设计与控制】 基于matlab的蚁群算法优化无人机uav巡检

摘要 本文使用蚁群算法&#xff08;ACO&#xff09;优化无人机&#xff08;UAV&#xff09;巡检路径。无人机巡检任务要求高效覆盖特定区域&#xff0c;以最小化能源消耗和时间。本研究提出的算法通过仿生蚁群算法优化巡检路径&#xff0c;在全局搜索和局部搜索中平衡探索与开…

文档布局内容检测系统源码分享

文档布局内容检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

银河麒麟高级服务器操作系统V10外接硬盘挂载指南

银河麒麟高级服务器操作系统V10外接硬盘挂载指南 1、临时挂载外接硬盘2、永久挂载外接硬盘3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在使用银河麒麟高级服务器操作系统V10时&#xff0c;您可能希望将外接硬盘&#xff08;如sd…

django应用JWT(JSON Web Token)实战

文章目录 一、什么是JWT二、为什么使用JWT三、在django项目中如何应用JWT1、安装djangorestframework-simplejwt库&#xff1a;2、在settings.py中配置JWT认证&#xff1a;3、在urls.py中配置JWT的获取和刷新路由&#xff1a; 四、JWT如何使用1、调用生成JWT的接口获取JWT2、客…

C/C++内存管理 ——

目录 五、C/C内存管理 1、C/C内存分布 2、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 4、operator new与operator delete函数 5、new和delete的实现原理 1.内置类…

十六 未来信息综合技术(考点篇)试题

SaaS&#xff1a;软件即服务&#xff0c;PaaS&#xff1a;平台即服务&#xff0c;LaaS&#xff1a;基础设施即服务。 SaaS&#xff1a;偏向于提供各种软件接口来提供相关的服务&#xff1b;PaaS&#xff1a;偏向于吧一些基础的功能整合成一个平台&#xff0c;把整个平台或部分…

【人工智能】Linux系统Mamba安装流程

在编译安装 mamba 之前&#xff0c;你需要确保已安装正常的PyTorch环境。 # 安装必要的系统依赖 sudo apt update sudo apt install build-essential # 安装mamba依赖 pip install packaging wheel # 克隆仓库 git clone https://github.com/Dao-AILab/causal-conv1d.git git …

【python】修改字典的内容

person {"name": "John", "age": 30, "city": "New York"} print("最开始的信息&#xff1a;",person)def process_person_info(person):# 检查对象中是否包含所有必要的键if name in person and age in person …

计算机人工智能前沿进展-大语言模型方向-2024-09-22

计算机人工智能前沿进展-大语言模型方向-2024-09-21 引言: 全球最热销的国产游戏-《黑神话: 悟空》不仅给世界各地玩家们带来愉悦&#xff0c;而且对计算机人工智能研究也带来新的思考。在本期的论文速读中&#xff0c;我们带来一篇关于视觉语言模型&#xff08;VLMs&#xf…

Java只有国人在搞了?

从Java诞生到现在&#xff0c;在全球一直属于最大的开发平台&#xff0c;拥有着世界上最多的开发者和最活跃的社区。你说Java只有国人在搞就有点过分了&#xff0c;Java中常用的主流框架全是外国人写的&#xff0c;虽说阿里也为Java做了很多贡献&#xff0c;但你还真没有资格说…

英伟达RTX 4090即将在10月份停产,RTX 50震撼来袭,你准备好了吗?

据多家媒体报道&#xff0c;英伟达&#xff08;NVIDIA&#xff09;及其合作伙伴计划于2024年10月停止生产其旗舰级显卡GeForce RTX 4090及其衍生型号RTX 4090D。尽管该计划尚未得到官方正式确认&#xff0c;但多家媒体和供应链消息均指出&#xff0c;这一决定旨在为即将到来的新…

vscode 配置rust格式化的正确方法

vscode 配置rust格式化的正确方法&#xff1a; 在settings.json里输入&#xff1a; "[rust]": {"editor.defaultFormatter": "rust-lang.rust-analyzer","editor.formatOnSave": true}

golang学习笔记6-更方便的转换、自定义包及网络部署【推荐收藏】

在上一个笔记中&#xff0c;我讲了基本数据类型的转换。不难发现&#xff0c;string和基本类型的互转比较麻烦&#xff0c;所以我自定义了一个包strtrans&#xff0c;封装了四个函数&#xff1a;ToString(),ToInt(),ToFloat(),ToBool()。其中ToString()适用于整数型&#xff0c…

关于字节 c++

字节的介绍 字节是计算机中最小的存储单位&#xff0c;通常由8个二进制位组成&#xff0c;用来存储一个字符。在C中&#xff0c;字节也是基本数据类型之一&#xff0c;用关键字"byte"来表示。字节主要用于存储一些较小的数据&#xff0c;如整数、字符等。字节的大小…

UE5入门

1.快捷键 工欲善其事&#xff0c;必先利其器&#xff0c;所以学习UE关卡编辑器快捷键必不可少 1.1Actor 选中actor &#xff0c; Q&#xff1a;选择模式 W&#xff1a;平移 E&#xff1a;旋转 R&#xff1a;缩放 CtrlB&#xff1a;打开Actor文件位置 F&#xff1a;聚焦 Ctr…

RP2040 C SDK GPIO和IRQ 唤醒功能使用

RP2040 C SDK GPIO和中断功能使用 &#x1f4d1;RP2040 中断功能简介 Each core is equipped with a standard ARM Nested Vectored Interrupt Controller (NVIC) which has 32 interrupt inputs. Each NVIC has the same interrupts routed to it, with the exception of the…