dll 实践说明 (cplusplus的使用)-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 3977291
  • 博文数量: 536
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4825
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(536)

文章存档

2024年(3)

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(252)

2006年(73)

分类:

2007-09-19 14:23:58

上篇的dll实践没把为什么的问题解决, 现在给补上:

-------------------
1>. _cplusplus的问题

  #ifdef _cplusplus  
  extern "c"{  
  #endif  
   
  #define gan_export32    __declspec(dllexport)

  gan_export32 int add2(int a, int b);

  #ifdef   _cplusplus 
  } 
  #endif

-----
  用这种方法就可以保持c/c 的兼容性, 当使用c 编译的使用编译器中会自动定义_cplusplus这个宏, 所以这个时候我们实际编译的文件就是:
  extern   "c"{ 
  
  #define gan_export32    __declspec(dllexport)

  gan_export32 int add2(int a, int b);

  };
  这个也就告诉了c 编译器在编译该段代码时要使用c的语法来进行编译一样。
  对于cl.exe这个编译器我测试了一下,如果我们使用的文件名为.c他会自动按c的语法来编译。如果我们使用的是.cpp将自动按c 语法来编译, 这个时候我们也可以让他按照c的语法来编译的,那就得使用这个extern "c" { };了。

------------
  一个很有趣的小事例:
  gandll.c文件不变,把gandll.h文件中的extern "c"{ };这个内容写上和不写, 我这里的写就不要用什么_cplusplus这东西了:
  a>. gandll.h为:
extern "c"
{

#define    gan_export32    __declspec(dllexport)

gan_export32 int add2(int a, int b);

}
编译结果为:
c:\gandll>cl /ld /w4 gandll.c
microsoft (r) 32-bit c/c optimizing compiler version 12.00.8168 for 80x86
凯发app官方网站 copyright (c) microsoft corp 1984-1998. all rights reserved.

gandll.c
gandll.h(7) : error c2059: syntax error : 'string'

c:\gan\ts\gandll>cl /ld /w4 gandll.c
microsoft (r) 32-bit c/c optimizing compiler version 12.00.8168 for 80x86
凯发app官方网站 copyright (c) microsoft corp 1984-1998. all rights reserved.

gandll.c
gandll.h(1) : error c2059: syntax error : 'string'
没办法通过的:

  b>. gandll.h为:
#define    gan_export32    __declspec(dllexport)

gan_export32 int add2(int a, int b);

编译结果为:
c:\gandll>cl /ld /w4 gandll.c
microsoft (r) 32-bit c/c optimizing compiler version 12.00.8168 for 80x86
凯发app官方网站 copyright (c) microsoft corp 1984-1998. all rights reserved.

gandll.c
microsoft (r) incremental linker version 6.00.8168
凯发app官方网站 copyright (c) microsoft corp 1992-1998. all rights reserved.

/out:gandll.dll
/dll
/implib:gandll.lib
gandll.obj
   creating library gandll.lib and object gandll.exp

用那个dumpbin可以看看哪个dll文件内容为:
c:\gandll>dumpbin /exports gandll.dll
microsoft (r) coff binary file dumper version 6.00.8168
凯发app官方网站 copyright (c) microsoft corp 1992-1998. all rights reserved.

dump of file gandll.dll

file type: dll

  section contains the following exports for gandll.dll

           0 characteristics
    46f0bb0a time date stamp wed sep 19 14:00:42 2007
        0.00 version
           1 ordinal base
           1 number of functions
           1 number of names

    ordinal hint rva      name

          1    0 00001000 add2

  summary

        4000 .data
        1000 .rdata
        1000 .reloc
        4000 .text

----------------------
再来个测试: 将哪个gandll.c文件内容不要变, 将文件名修改为gandll.cpp
  a>. gandll.h为:
extern "c"
{

#define    gan_export32    __declspec(dllexport)

gan_export32 int add2(int a, int b);
}
编译结果:
c:\gandll>cl /ld /w4 gandll.cpp
microsoft (r) 32-bit c/c optimizing compiler version 12.00.8168 for 80x86
凯发app官方网站 copyright (c) microsoft corp 1984-1998. all rights reserved.

gandll.cpp
microsoft (r) incremental linker version 6.00.8168
凯发app官方网站 copyright (c) microsoft corp 1992-1998. all rights reserved.

/out:gandll.dll
/dll
/implib:gandll.lib
gandll.obj
   creating library gandll.lib and object gandll.exp

dumpbin查看的结果为:
c:\gandll>dumpbin /exports gandll.dll
microsoft (r) coff binary file dumper version 6.00.8168
凯发app官方网站 copyright (c) microsoft corp 1992-1998. all rights reserved.


dump of file gandll.dll

file type: dll

  section contains the following exports for gandll.dll

           0 characteristics
    46f0bc0e time date stamp wed sep 19 14:05:02 2007
        0.00 version
           1 ordinal base
           1 number of functions
           1 number of names

    ordinal hint rva      name

          1    0 00001000 add2

  summary

        4000 .data
        1000 .rdata
        1000 .reloc
        4000 .text

------------
  b>. gandll.h为:
#define    gan_export32    __declspec(dllexport)

gan_export32 int add2(int a, int b);

编译结果为:
c:\gandll>cl /ld /w4 gandll.cpp
microsoft (r) 32-bit c/c optimizing compiler version 12.00.8168 for 80x86
凯发app官方网站 copyright (c) microsoft corp 1984-1998. all rights reserved.

gandll.cpp
microsoft (r) incremental linker version 6.00.8168
凯发app官方网站 copyright (c) microsoft corp 1992-1998. all rights reserved.

/out:gandll.dll
/dll
/implib:gandll.lib
gandll.obj
   creating library gandll.lib and object gandll.exp

dumpbin查看的结果为:
c:、gandll>dumpbin /exports gandll.dll
microsoft (r) coff binary file dumper version 6.00.8168
凯发app官方网站 copyright (c) microsoft corp 1992-1998. all rights reserved.

dump of file gandll.dll

file type: dll

  section contains the following exports for gandll.dll

           0 characteristics
    46f0bc84 time date stamp wed sep 19 14:07:00 2007
        0.00 version
           1 ordinal base
           1 number of functions
           1 number of names

    ordinal hint rva      name

          1    0 00001000 ?add2@@yahhh@z

  summary

        4000 .data
        1000 .rdata
        1000 .reloc
        4000 .text

你可以仔细比较以下有什么不一样的哦!
   1>. 按照c 编译出来的哪个dll名字变了“?add2@@yahhh@z”, 哎, 我是使用不了c 的,没办法控制, 暂时就不去了解为什么了吧, 知道会改变输出函数名就可以了(既然没有经过我同意编译器自己来修改我的函数名, 不象话, 哈哈, 玩笑了)。
   2>. 你如果使用.c为文件名那cl只会把他当成c文件来编译的。当你使用c, c 混合编程是一定要注意_cplusplus的问题哦。   
阅读(3601) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图