c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL
2017-08-09 15:44
417 查看
总结点
c++动态库调用另一个动态库
c++动态库调用c动态库
c#等其他语言调用c/c++动态库
IDE
vs2010及以上c++动态库调用另一个动态库
a动态库调用另一个动态库b,主要由2种方式,在头文件中声明
__< 4000 span class="hljs-function">declspec(dllexport)
def文件
利用.def文件新建此DLL(模块)的导出接口,例如:EXPORTS必须为大写
LIBRARY EXPORTS add @1 mul @2
关于.def的详细说明,请参考msdn文档;
https://msdn.microsoft.com/zh-cn/library/hyx1zcd3(v=vs.80).aspx
两种方式比较
关于两者的优点和缺点,请参考文章:http://www.cnblogs.com/TianFang/archive/2013/05/04/3059073.html
总的来说,def优点大于每个接口前声明__declspec(export) 这种方法。
例子
DLL a 的结构如下所示:DLL b 的结构如下所示:
代码分别为:
DLL a
#include "../circle/iadd.h" #include "../circle/imul.h" #include "../cgrid/csize.h" #pragma comment(lib,"circle.lib") #pragma comment(lib,"cgrid.lib") void main() { int c = add(1,2); c *= mul(3,4); double cnt = calcnt(10,2); }
DLL b
iadd.h 头文件:#ifndef IADD_H #define IADD_H int __stdcall add(int,int); //__stdcall: add can be used by other languages,C#,Java... #endif
imul.h 头文件:
#ifndef IMUL_H #define IMUL_H int __stdcall mul(int,int); //__stdcall: mul can be used by other languages,C#,Java... #endif
iadd.cpp:
#include "iadd.h" int __stdcall add(int a, int b) { return a+b; }
imul.cpp:
#include "imul.h" int __stdcall mul(int a, int b) { return a*b; }
interface.def:
LIBRARY EXPORTS add @1 mul @2
手动配置lib, dll输出路径
为了统一管理,将lib(a链接b要用到), dll(启动a, 运行程序时要用到b),设置生成这两个文件的路径都在 bin 下:设置DLL a 的输出路径:
设置DLL a 引用的DLL b的 Lib文件(链接时用到)的链接路径:
设置DLL b 的输出路径:
此时的整个文件结构如下如所示:
以上完成后,DLL a main方法就可以调用 b的接口了。
c++动态库调用c动态库
请参考文章:针对动态加载方式的C/C++动态链接库编写(http://www.cnblogs.com/ycloneal/p/5722928.html)这里面做了详细的介绍,关键一点 在头文件中声明调用方式为__stdcall,具体格式如下(必须按照这个格式)
#ifdef __cplusplus extern "C"{ double __stdcall calcnt(double area, double boxarea); } #endif
c#等其他语言调用c/c++动态库
具体文章请参考 : C#调用C++动态库(dll)http://www.cnblogs.com/hongmaju/p/4727173.html
总而言之,刚才提到的__stdcall正是可以让其他语言C#, JAVA等可以调用C++DLL的前提。
具体代码:
class Program { [DllImport("circle.dll", CallingConvention = CallingConvention.Winapi)] //c++ public static extern int add(int a, int b); [DllImport("cgrid.dll", CallingConvention = CallingConvention.Winapi)] //c public static extern double calcnt(double area, double boxarea); static void Main(string[] args) { int sum = add(1, 3); double cnt = calcnt(100, 2); } }
源码下载
http://download.csdn.net/detail/daigualu/9926444相关文章推荐
- Codeblosks用C++编写通用DLL供其他语言调用
- c#编写dll 供其他语言调用问题
- C#中调用其他语言写的DLL
- C#编写dll库文件并注册为COM组件供其他语言(如PHP等)调用
- 关于C++调用C#语言DLL(类库)
- C#调用使用C++\CLI封装的标准C++ DLL问题:无法访问受保护的内存,这通常指示其他内存已损坏
- c# 调用c++dll挂钩其他程序线程或者进程
- C#中调用其他语言写的DLL
- VS2010使用C#调用C++编写的dll,在其他电脑上无法运行的解决办法
- win xp C# 调用 C++ dll system.dllnotfoundexception
- C#调用C++Dll封装时遇到的一系列问题
- C#调用c++创建的dll
- c#调用C++DLL EntryPointNotFoundException 找不到入口点
- C#调用C++编写的COM DLL
- 【windows8开发】回复g10589119提出的问题(c#调用C++/CX dll)
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
- C\C++ Dll ->C# ->MaxScript通过C#调用C++写的Dll
- C#调用C++动态库(dll)
- C++中调用C# DLL