![]() |
1
114
如果您想要纯C导出,请使用C项目而不是C++。C++ DLL依赖于对所有C++ ISM(命名空间等…)的名称篡改。您可以通过在C/C++ +-G.Advestin中进入项目设置来编译C代码,有一个选项“编译为”,它与编译器交换机/TP和/TC协同工作。 在vc中导出/导入dll libs++您真正想做的是在一个头文件中定义一个条件宏,该头文件将包含在您的dll项目中的所有源文件中:
然后在要导出的函数上使用
在库构建项目中创建一个定义
自从
如果您的库是跨平台的,那么您可以在不在Windows上的情况下将库_API定义为Nothing:
使用dllexport/dllimport时,不需要使用def文件,如果使用def文件,则不需要使用dllexport/dllimport。两种方法以不同的方式完成相同的任务,我认为dllexport/dllimport是其中推荐的方法。 从C++DLL中导出unMulink函数用于加载库/pNoCKE
如果您需要这个来使用LoadLibrary和GetProcAddress,或者从.NET执行pinvoke,您可以使用
代码:
下面是dumpbin/exports的导出结果:
所以这个代码很好用:
|
![]() |
2
18
对于C++:
我刚刚遇到了同样的问题,我认为值得一提的是,当一个人同时使用两种方法时,会出现一个问题。
正如你所知道的
获得未修饰的符号名称:
然而
以及
如果您同时针对x86和x64平台,这就特别棘手。 两个解决方案
然后在函数体中包含以下pragma:
完整例子:
这将为x86和x64目标导出未修饰的函数,同时保留
|
![]() |
3
3
我也有同样的问题,我的解决方案是使用模块定义文件(.def)而不是
|
![]() |
4
-1
我认为裸体可能得到你想要的,但它也阻止编译器为函数生成堆栈管理代码。外部“C”导致C样式的名称装饰。删除它,这样就可以去掉你的。链接器不添加下划线,编译器会添加。stdcall导致附加参数堆栈大小。 更多,请参见: http://en.wikipedia.org/wiki/X86_calling_conventions http://www.codeproject.com/KB/cpp/calling_conventions_demystified.aspx 更大的问题是你为什么要这样做?这些乱七八糟的名字怎么了? |
![]() |
JoeZ · Do while循环不会中断 6 年前 |
![]() |
JoeZ · 如果循环不工作。运行时显示重复cout。 6 年前 |
![]() |
Joe · 正在展开宏以进行调试? 6 年前 |
|
Matthew · 自己编译公共库会提高性能吗? 6 年前 |
![]() |
Barry · 在MSVC中处理宏中的额外括号 6 年前 |