动态链接库

动态链接库的创建和使用 动态链接库的创建和使用 一. 创建动态链接库 1. 创建动态链接库项目 1. 1 动态链接库(DLL) 项目结构如下 为了节约大型项目的编译时间,系统自动为我们生成了和预编译头相关两个文件pch.cpp和pch.h,我们可以选择保留或者是删除他们。如果决定保留则需要在项目中每个源文件的最前面加入#include "pch.h",否则无法通过编译。如果删除了他们,同时还需要到项目属性中禁用预编译头,具体方法如下: dllmain.cpp定义了动态库的入口,当系统开始或终止一个进程或线程的时候,会调用每个 阅读详情

----首先你是在编写一个C++母程序,想调用so文件,于是包含了<dlfcn.h>这个头文件。程序中需调用dlopen以及dlsym来使用你做的so文件,但当运行g++ -o urname urname.cpp -ldl时,使用gdb调试时,dlerror会报函数名没有被定义,即dlerror返回了NULL。

---解决办法:检查你的so文件的生成代码,你的生成代码如果是C++程序,这时需要在函数名之前加extern “C”来修饰。然后再g++ -fpic -shared -o runame.so urname.cpp重新生成so文件。

---愿因:dlsym是C接口,而生成动态库的是C++程序,是C++接口,默认定义了_cplusplus这个宏,于是编译器会按照C++的规则去生成函数名。因此so文件中包含的接口应被声明按C规则编译,否则dlsym会因匹配不到函数名而报错。

这里转一个gcc和g++的区别,作者归纳的挺好。

总结两点:

一,gcc和g++在编译的时候,工作是一样的。只是在链接时对于C++程序需使用g++。

二,_cplusplus这个宏只有在:1,C程序;2,使用gcc编译。这两个条件都具备的条件下才没被定义。

---------------------------------------------------------------------------------------------

---------------------------------->>>>>>>>>><<<<<<<<<<<<<<<<---------------------------------

---------------------------------------------------------------------------------------------

gcc和g++都是GNU(组织)的一个编译器。

误区一:gcc只能编译c代码,g++只能编译c++代码
两者都可以,但是请注意:
1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。
2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。

误区二:gcc不会定义__cplusplus宏,而g++会
实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

误区三:编译只能用gcc,链接只能用g++
严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。
gcc和g++的区别
我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++,或者说编译用 gcc,链接用g++,一时也不知哪个说法正确,如果再遇上个extern "C",分歧就更多了,这里我想作个了结,毕竟知识的目的是令人更清醒,而不是更糊涂。
误区一:gcc只能编译c代码,g++只能编译c++代码

两者都可以,但是请注意:
1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,例如:
#include <stdio.h>
int main(int argc, char* argv[]) {
   if(argv == 0) return;
   printString(argv);
   return;
}
int printString(char* string) {
sprintf(string, "This is a test.n");
}
如果按照C的语法规则,OK,没问题,但是,一旦把后缀改为cpp,立刻报三个错:“printString未定义”;
“cannot convert `char**' to `char*”;
”return-statement with no value“;
分别对应前面红色标注的部分。可见C++的语法规则更加严谨一些。
2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。
误区二:gcc不会定义__cplusplus宏,而g++会

实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。
误区三:编译只能用gcc,链接只能用g++

严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。
误区四:extern "C"与gcc/g++有关系

实际上并无关系,无论是gcc还是g++,用extern "c"时,都是以C的命名方式来为symbol命名,否则,都以c++方式命名。试验如下:
me.h:
extern "C" void CppPrintf(void);
me.cpp:
#include <iostream>
#include "me.h"
using namespace std;
void CppPrintf(void)
{
     cout << "Hellon";
}
test.cpp:
#include <stdlib.h>
#include <stdio.h>
#include "me.h"      
int main(void)
{
    CppPrintf();
    return 0;
}
1. 先给me.h加上extern "C",看用gcc和g++命名有什么不同

[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv        //注意此函数的命名
        .type   CppPrintf, @function
[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv        //注意此函数的命名
        .type   CppPrintf, @function
完全相同!
       

动态链接库全面浅析(一)-----Win32 动态链接库 言前:由于最近复习了下动态链接库,所以决定写一个动态链接库专题。动态链接库网上各种达人已近写过很多了,资料也是一大把一大把的。但是我还是想写一份,因为网上讲的都很分散,讲的不是很系统,而且很多问题没有深究。因此我自己还是写一份吧,因为说明了是浅析。所以说我不可能讲的太深入,但是本 阅读详情

相关推荐

Qt之动态链接库

Qt之动态链接库

weixin_44875787的博客 1725

动态链接库是什么?怎么用?

最近了解了一下关于动态链接库的知识。 动态链接库按照一系列的命令就可以生成。linux下的.so文件。 1,.so到底是什么? 我们编出动态链接库,只需要用到的头文件和.so就可以使用其中的函数,实际上头文件也是为了让用户看一看,实际连头文件都不用。 简单来看,动态链接库就是.c,.cpp文件的集合,然后在调用的时候就需要一个接口头文件和头文件下的函数声明而已。这样我们就可以将动态链接库重...

more_HH 8240

OPC全套的动态链接库

OpcRcw.Da OpcRcw.Comn 等opc全套连接库 很全的资料,方便大家的使用

动态链接库的生成和使用,从入门到精通

1. 动态链接库和静态链接库的区别 静态链接库(.LIB) 由函数和数据编译而成的一个二进制文件。使用时,在编译链接阶段,由链接器从库中复制这些函数和数据,并把他们与应用程序的其他模块组合起来创建最终的可执行文件。由于静态链接库中的程序和数据已经被复制并应用到可执行文件中,因此发布产品时不需要发布使用的静态库文件。 动态链接库 (.DLL) 包含被可执行程序或其他DLL调用来完成某项工作的函数,不可以直接运行,也不可以接收消息。动态链接库一半包含两个文件,引入库文件(.LIB)和动态链接库文件(.DLL)。

sunrise_lk的博客 1万+

全套OPC dll动态链接库(C#版)

OpcNetApi.Com.dll OpcNetApi.dll OPCDAAuto.dll OpcRcw.Ae.dll OpcRcw.Batch.dll OpcRcw.Cmd.dll OpcRcw.Comn.dll OpcRcw.Da.dll OpcRcw.Dx.dll OpcRcw.Hda.dll OpcRcw.Sec.dll OpcCmdPs.dll OpcDxPs.dll

opc的各种dll

opc的各种dll,包括OpcCmdPs.dll,OpcDxPs.dll,OpcRcw.Ae.dll,OpcRcw.Batch.dll,OpcRcw.Cmd.dll,OpcRcw.Comn.dll,OpcRcw.Da.dll,OpcRcw.Dx.dll,OpcRcw.Hda.dll,OpcRcw.Sec.dll

Linux动态链接库的使用

1、前言   在实际开发过程中,各个模块之间会涉及到一些通用的功能,比如读写文件,查找、排序。为了减少代码的冗余,提高代码的质量,可以将这些通用的部分提取出来,做出公共的模块库。通过动态链接库可以实现多个模块之间共享公共的函数。之前看《程序员的自我修养》中讲到程序的链接和装入过程,这些玩意都是底层的,对于理解程序的编译过程有好处。http://www.ibm.com/developerworks...

好习惯成就伟大 5748

kettle实验十一:没有数据流入时停止操作

【实验目的】 1.利用Kettle的“阻塞数据直到步骤都完成”,“检测空流”,“中止”等组件,实现Kettle转换流程的控制。 2.熟练掌握“阻塞数据直到步骤都完成”,“检测空流”,“中止”等组件的使用,实现Kettle转换流程的控制。 【实验原理】 “检测空流”组件可以检测所在转换的输入数据,如果整个转换没有输入数据,通过“中止”组件终止整个转换的流程。在存在数据输入的情况,为了能让数据输出,需要和“阻塞数据直到步骤都完成”配合使用。当所有数据都已经从上个步骤“字段选择”读取完毕后,通过“阻塞数据直到步骤

weixin_44727274的博客 3848

Linux动态链接库

在 Linux 系统中,动态链接库(Dynamic Link Library)和共享库(Shared Library)是指同一概念的不同称谓,通常指的是 .so(shared object)文件。这类库在 Linux 和其他类 Unix 操作系统中非常常见,用于实现程序的模块化和资源的共享。动态链接库/共享库是一种二进制文件,其中包含了一组预先编译好的函数和数据结构,可以被多个不同的程序共享。这些库通常在程序运行时被加载,并且可以被多个进程同时使用。在 Linux 中,动态链接库通常以.so。

分享不一样的技术,与你一起共同成长! 2349

OC5021B 100V宽电压输入 LED车灯/大功率照明 DC降压型恒流驱动器

适用于LED大功率汽车大灯/大功率照明 OC5021B 100V宽电压输入 5A电流设计 DC-DC降压型恒流驱动IC

Handsome63841990的博客 2417

stm32教程之三重ADC交错采样

ps:本文基于stm32F407ZGT6单片机 stm32F4单片机单通道采集的最大采样率为2.4M,所以有时会难以满足较高频率的采样,于是查阅芯片手册,发现stm32F4支持多重ADC采集,利用每个通道的转换时间,错位采样,从而提高采样率,最大把采样率开到2.4*3=7.2M. (去年初学ADC时研究的,基于cube和HAL库的三重ADC交错采样参考资料不多,我也是研究了一段时间,写下这篇博客希望可以帮助到更多人。) 示意图如下: 以下是官方例子的说明, In this ex...

weixin_52178036的博客 8877

Linux中动态链接库总结

#参考:#    http://www.abc188.com/info/html/wangzhanyunying/jianzhanjingyan/20080417/70810.html#    http://os.51cto.com/art/201001/176625.htm#    http://os.51cto.com/art/201001/176618.htm[概述]本文

明月江の鱼 9193

电商客服效率翻倍!手把手教你用影刀RPA+AI搭建智能回复系统(附实战配置)

本文详细介绍了如何利用影刀RPA+AI技术搭建电商智能客服系统,实现24小时在线回复,大幅提升客服效率。通过零代码配置、Excel词库管理和AI语义理解,系统能处理80%常规咨询,响应速度稳定在3秒内,特别适合中小电商降低成本并提升服务质量。

weixin_42520661的博客 550

C/C++动态链接库的封装和调用

本文介绍了C++里面动态链接库封装和调用的详细步骤以及注意事项

Dfreedom.的博客 2182

在已有win10系统下安装Ubuntu,最后出现执行‘grub-install/dev/nvme0n1p5‘失败的致命错误的解决方案

本人电脑型号戴尔灵越,两个SSD512G固态硬盘,c盘为系统盘. Ubuntu版本为20.04LTS,在官网下载https://ubuntu.com/download/desktop/thank-you?version=20.04.3&architecture=amd64 系统盘制作工具为Rufus-3.15http://rufus.ie/zh/ 安装过程网上很多,在这里就不赘述了. 其他安装过程都很顺利,直至安装最后出现这个 本来安装了到最后还以为成了,结果又不行...... 后.

XiaoChen_gugugu的博客 1万+

文本→图像→视频:AIGC跨模态转换全流程解析

本文旨在系统性地解析AIGC领域中跨模态内容生成的技术原理和实现方法,特别聚焦于从文本到图像再到视频的完整转换流程。跨模态表示学习的基本原理文本到图像生成的核心技术图像到视频转换的关键算法端到端跨模态生成系统的构建方法实际应用场景和性能优化策略背景介绍:建立基本概念和知识框架核心概念:解析跨模态转换的关键技术和原理算法细节:深入讲解文本到图像、图像到视频的核心算法数学模型:提供必要的数学基础和公式推导项目实战:通过完整案例展示实现过程应用场景:探讨技术的实际应用可能性。

AI天才研究院 1353

vs下c语言制作动态链接库,使用Visual Studio进行动态链接库开发流程

一、动态链接库和动态链接动态链接库:在 Windows 中,动态链接库 (DLL) 是作为函数和资源的共享库的一种可执行文件。在调用它们的应用程序的上下文中运行。动态链接:动态链接是操作系统功能。操作系统将 DLL 加载到应用程序的内存空间中,它可使执行文件调用函数或使用存储在单独文件中的资源。动态链接库有什么用: DLL 可以在可执行文件之间轻松共享函数和资源。 多个应用程序可同时访问内存中单个...

weixin_34007013的博客 1842

基于FPGA的数字信号处理(17)--定点运算的实现实例(饱和Saturate与四舍五入Round)

基于FPGA的数字信号处理(17)--定点运算的实现实例(饱和Saturate与四舍五入Round)

孤独的单刀 2960

Python 调用动态链接库

Python 调用动态链接库 ctypes是Python调用c的动态链接库的一个内置模块。 通过 CMake 构建动态链接库 项目结构 ├── CMakeLists.txt # CMake 构建配置文件 ├── library.h # 动态链接库头文件 └── library.cpp # 动态链接库源文件...

縌兲孓 9199

社区版 ABAP MCP 能不能读取 SAP S/4HANA 公有云开发对象,我的判断是能试,但不能当成已被 SAP 背书的标准通道

文章摘要:当前存在多个社区项目(如mcp-abap-adt、mcp-abap-abap-adt-api等)通过包装ABAP ADT能力为MCP Server,使AI开发工具能读取ABAP对象。这些项目技术上依赖ADT HTTP API或SAP官方ADT language server,但针对SAP S/4HANA Cloud Public Edition的完整适配仍存在挑战。SAP官方已通过VS Code扩展提供ADT MCP能力,而社区方案在云环境下需遵循ABAP Cloud的严格限制,仅能访问已授权的开

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 87

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 各大网站 http server分析
下一篇: mysql 从一个表插入另一个表
路人甲三号
博客等级 码龄18年 8粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值