织梦CMS - 轻松建站从此开始!

罗索

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

落鹤生 发布于 2011-01-12 09:30 点击:次 
编译c++ dll注意函数之前需要加上 extern "C",否则在dlsym函数调用的时候可能会找不到函数
TAG:

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
Cpp代码

  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <dlfcn.h>
  4. using namespace std;
  5.  
  6. #define TRUE    1
  7. #define FALSE   0
  8. typedef int     BOOL;
  9. typedef void (*PFUN_STRING)(char* pszStr);
  10. BOOL UseDll(char* szMsg);
  11. int main()   
  12. {
  13.     char szMsg[] = "Hello, andylin!";

  14.     //调用dll
  15.     UseDll(szMsg);

  16.     return 0;
  17. }
  18. BOOL UseDll(char* szMsg)
  19. {
  20.     void* hDll = NULL;
  21.     char* szDllErr = NULL;
  22.     PFUN_STRING pfunUpper = NULL;
  23.     PFUN_STRING pfunLower = NULL;

  24.     if (NULL == szMsg)
  25.     {
  26.         return FALSE;
  27.     }

  28.     cout << "The Origin String:" << szMsg << endl;

  29.     //open dll
  30.     hDll = dlopen("./strcase.dll", RTLD_LAZY);
  31.     szDllErr = dlerror();
  32.     if (szDllErr)
  33.     {
  34.         cout << "open uppercase.dll error! err info:" << szDllErr << endl;
  35.         return FALSE;
  36.     }

  37.     //find the function
  38.     pfunUpper = (PFUN_STRING)dlsym(hDll, "StrUpper");
  39.     szDllErr = dlerror();

  40.     if (szDllErr)
  41.     {
  42.         cout << "find function StrUpper Error! err info:" << szDllErr << endl;
  43.         return FALSE;
  44.     }

  45.     (*pfunUpper)(szMsg);
  46.     cout << "after StrUpper string:" << szMsg << endl;

  47.     //call StrLower
  48.     pfunLower = (PFUN_STRING)dlsym(hDll, "StrLower");
  49.     szDllErr = dlerror();

  50.     if (szDllErr)
  51.     {
  52.         cout << "find function StrLower Error! err info:" << szDllErr << endl;
  53.         return FALSE;
  54.     }

  55.     (* pfunLower)(szMsg);
  56.     cout << "after StrLower string:" << szMsg << endl;

  57.     //close handle
  58.     int nRet = dlclose(hDll);
  59.     szDllErr = dlerror();
  60.     cout << "close dll info:" << szDllErr << endl;
  61. }
  62.  

//lowcase.cpp
Cpp代码

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <iostream> 
  4. using namespace std; 
  5. extern "C" void StrLower(char* pszStr) 
  6.     if (NULL == pszStr) 
  7.     { 
  8.         return
  9.     } 
  10.  
  11.     int nLen = 0; 
  12.     int i = 0; 
  13.  
  14.     nLen = strlen(pszStr); 
  15.     for (i = 0; i < nLen; i++) 
  16.     { 
  17.         if ( (pszStr[i] >= 'A') && (pszStr[i] <= 'Z') ) 
  18.         { 
  19.             pszStr[i] += 'a' - 'A'
  20.         } 
  21.     } 

//uppercase.cpp
Cpp代码

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <iostream> 
  4. using namespace std; 
  5.  
  6. extern "C" void StrUpper(char* pszStr) 
  7.     if (NULL == pszStr) 
  8.     { 
  9.         return
  10.     } 
  11.     int nLen = 0; 
  12.     int i = 0; 
  13.  
  14.     nLen = strlen(pszStr); 
  15.     for (i = 0; i < nLen; i++) 
  16.     { 
  17.         if ( (pszStr[i] >= 'a') && (pszStr[i] <= 'z') ) 
  18.         { 
  19.             pszStr[i] -= 'a' - 'A'
  20.         } 
  21.     } 
(andylin02 )
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201101/10750.html]
本文出处:javaeye.com 作者:andylin02
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容