`

自己实现的第一个linux中dll的调用

阅读更多

 

自己实现的第一个linux中dll的调用


1. 编译dll:

g++ -shared -lc -o strcase.dll  lowcase.cpp uppercase.cpp

如果要加入调试信息:(加上 -g选项)

g++ -shared -lc -o strcase.dll  lowcase.cpp uppercase.cpp -g


编译c++ dll注意函数之前需要加上 extern "C",否则在dlsym函数调用的时候可能会找不到函数


.


2. 编译exe:

g++ -ldl  -o strcase.exe main.cpp

如果要加入调试信息:(加上 -g选项)

g++ -ldl  -o strcase.exe main.cpp -g


3. gdb调试

gdb strcase.exe

调试时需要在编译的时候加上(-g)选项


gdb命令:


b 设置断点,例如: 

b main #表示跳到main函数

b main.cpp: 56 #56表示行号


l 打印当前的执行代码附近的10行


p 打印变量szMsg的值

p szMsg


n 执行下一行(单步执行, 类似VC中的F10)


s 进入函数(类似VC中的F10)


r 开始执行

 


//main.cpp

 

#include <iostream>
#include <stdlib.h>
#include <dlfcn.h>
using namespace std;

#define	TRUE	1
#define FALSE	0
typedef int 	BOOL;
typedef void (*PFUN_STRING)(char* pszStr);

BOOL UseDll(char* szMsg);

int main()
{
	char szMsg[] = "Hello, andylin!";
	
	//调用dll
	UseDll(szMsg);
	
	return 0;
}

BOOL UseDll(char* szMsg)
{
	void* hDll = NULL;
	char* szDllErr = NULL;
	PFUN_STRING pfunUpper = NULL;
	PFUN_STRING pfunLower = NULL;
	
	if (NULL == szMsg)
	{
		return FALSE;
	}
	
	cout << "The Origin String:" << szMsg << endl;
	
	//open dll
	hDll = dlopen("./strcase.dll", RTLD_LAZY);
	szDllErr = dlerror();	
	if (szDllErr)
	{
		cout << "open uppercase.dll error! err info:" << szDllErr << endl;
		return FALSE;
	}
	
	//find the function
	pfunUpper = (PFUN_STRING)dlsym(hDll, "StrUpper");	
	szDllErr = dlerror();
	
	if (szDllErr)
	{
		cout << "find function StrUpper Error! err info:" << szDllErr << endl;
		return FALSE;
	}
	
	(*pfunUpper)(szMsg);
	cout << "after StrUpper string:" << szMsg << endl;
	
	//call StrLower
	pfunLower = (PFUN_STRING)dlsym(hDll, "StrLower");
	szDllErr = dlerror();
	
	if (szDllErr)
	{
		cout << "find function StrLower Error! err info:" << szDllErr << endl;
		return FALSE;
	}
	
	(* pfunLower)(szMsg);
	cout << "after StrLower string:" << szMsg << endl;
	
	//close handle
	int nRet = dlclose(hDll);
	szDllErr = dlerror();
	cout << "close dll info:" << szDllErr << endl;	
}

 

 

//lowcase.cpp

 

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

extern "C" void StrLower(char* pszStr)
{
	if (NULL == pszStr)
	{
		return;
	}

	int nLen = 0;
	int	i = 0;
	
	nLen = strlen(pszStr);
	for (i = 0; i < nLen; i++)
	{
		if ( (pszStr[i] >= 'A') && (pszStr[i] <= 'Z') )
		{
			pszStr[i] += 'a' - 'A';
		}
	}
}

 

 

//uppercase.cpp

 

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

extern "C" void StrUpper(char* pszStr)
{
	if (NULL == pszStr)
	{
		return;
	}

	int nLen = 0;
	int	i = 0;
	
	nLen = strlen(pszStr);
	for (i = 0; i < nLen; i++)
	{
		if ( (pszStr[i] >= 'a') && (pszStr[i] <= 'z') )
		{
			pszStr[i] -= 'a' - 'A';
		}
	}
}

 

 

1
0
分享到:
评论
3 楼 七猫 2010-02-24  
印像中一般会有-fpic
2 楼 mikeandmore 2010-02-23  
weibei 写道
弱弱的问一句,linux中有dll吗?

应该叫share object
1 楼 weibei 2010-02-23  
弱弱的问一句,linux中有dll吗?

相关推荐

    亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。

    亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。

    Qt调用dll的功能函数

    本资料的内容分两部分:第一部分是QT在windows上DLL的导出和调用;第二部分是QT在linux上DLL的导出和调用。

    Qt调用dll中的功能函数

    篇内容分两部分:第一部分是 QT在 windows 上 DLL的导出和调用; 第二部分是 QT在 linux 上 DLL(os)的导出和调用; /////////////////////////////////////////////////////////////////////////////////////...

    MingW VC 之.a .lib .dll .def 关系

    那么你在VC中调用一个MinGW的dll时你就会发现,问题变得很棘手。def的函数名书写规则和你要调用dll的函数约定有关,和dll里的前后缀无关。切记!) 另外, 在使用dll里的函数的时候,需要一份.h文件,对调用的函数...

    java使用jna调用c#中dll的方法详解

    前一段时间接了个项目,需要用到第三方提供的C#编写的dll,本身项目是java语言,所以便有了下面这篇文章,本文给大家介绍了关于java中如何使用jna调用c#中dll的相关资料,文中通过示例代码介绍的非常详细,需要的...

    swmmh50022_engine

    如果选用的开发语言为C/C++则可以选用第一种方式直接将源码集成到项目代码中,这样不仅调试方便,而且效率更高,省去了dll的编译与调用解析过程。但是由于在GIS二次开发中C#语言的认知和使用更为方便,因此为将两种...

    vc++ 应用源码包_6

    dll的一个实例。 OD反汇编引擎(带VC修改版和原版) 如题。主要文件就4个,非常适合学习,详细见源码。 OPENG开发的示例代码c++版 演示了OpenG的使用方法,内含几个实例,一个实例就3个文件。 p2p vb实例。 p2p+...

    cmd操作命令和linux命令大全收集

    3. Nslookup-------IP地址侦测器 ,是一个 监测网络中 DNS 服务器是否能正确实现域名解析的命令行工具。它在 Windows NT/2000/XP 中均可使用,但在 Windows 98 中却没有集成这一个工具。 4. explorer-------打开...

    vc++ 应用源码包_1

    dll的一个实例。 OD反汇编引擎(带VC修改版和原版) 如题。主要文件就4个,非常适合学习,详细见源码。 OPENG开发的示例代码c++版 演示了OpenG的使用方法,内含几个实例,一个实例就3个文件。 p2p vb实例。 p2p+...

    vc++ 应用源码包_2

    dll的一个实例。 OD反汇编引擎(带VC修改版和原版) 如题。主要文件就4个,非常适合学习,详细见源码。 OPENG开发的示例代码c++版 演示了OpenG的使用方法,内含几个实例,一个实例就3个文件。 p2p vb实例。 p2p+...

    vc++ 应用源码包_5

    dll的一个实例。 OD反汇编引擎(带VC修改版和原版) 如题。主要文件就4个,非常适合学习,详细见源码。 OPENG开发的示例代码c++版 演示了OpenG的使用方法,内含几个实例,一个实例就3个文件。 p2p vb实例。 p2p+...

    vc++ 应用源码包_3

    dll的一个实例。 OD反汇编引擎(带VC修改版和原版) 如题。主要文件就4个,非常适合学习,详细见源码。 OPENG开发的示例代码c++版 演示了OpenG的使用方法,内含几个实例,一个实例就3个文件。 p2p vb实例。 p2p+...

    Python Cookbook

    第1章 文本 1 引言 1 1.1 每次处理一个字符 6 1.2 字符和字符值之间的转换 7 1.3 测试一个对象是否是类字符串 8 1.4 字符串对齐 10 1.5 去除字符串两端的空格 11 1.6 合并字符串 11 1.7 将字符串逐字符或逐...

    vc++ 开发实例源码包

    请求的长度在第一个INT中指定. 2) 每个服务器通常会向多种客户提供服务, 例如, TS要同时向CP, NP提供服务, CP要向NP和其他CP提供服务, 同时还是其他CP, TS, SP的客户. 3) 每个服务器为客户服务时, 通常是长期的, 会...

    auto_Click_Mouse.zip

    用C#写的,github上我也放了源...这个鼠标点击调用的windows的dll,算是第二级别的,可以全局范围内生效,最底层的驱动级别的模拟需要加载一个驱动程序,然后直接模拟硬件信号。这个后续做。dll全局级别的已经够用。

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

    这个参数包括了文件描述,表,缓冲,标志位等,它在所有gSOAP函数中都是第一个参数。  gSOAP运行环境实例是一个struct soap类型的变量。当客户端程序访问远程方法前或当服务端程序能够接收一个请求前,必须先将这个...

    java开源包1

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    c#学习笔记.txt

    )专为.NET设计的一门语言,号称“C/C++家族中第一种面向组件的语言”。很多人觉得它应该像C或者C++,但事实上它更像是java的一个clone,所以作为入门,读一下清华大学出版社出版的《Java 语言与面向对象程序设计》...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    种方法实现了信号和槽函数的关联,第一个按钮我们直接在设计器中实现其关 联;第二个按钮我们自己写了槽函数语句,其实图形的设计与直接写代码效果是 一样的。 这个程序里我们实现了两类窗口打开的方式,一个是自身...

    JAVA上百实例源码以及开源项目

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

Global site tag (gtag.js) - Google Analytics