问题 在GCC或Cygwin中创建DLL?


我需要帮助将脚本(“iterator.c”)编译成DLL。我不能使用VS2010,因为它确实如此  支持在C99标准中添加到C的功能(我使用“complex.h”但VB不支持它)。

我一直在寻找替代品,但我发现的只是GCC,我不知道如何安装/使用(真的,我花了半个小时阅读文档,我甚至不懂我应该安装它,和Cygwin,我已经安装但我不知道如何使用它们。另外,我已经安装了MinGW,但我认为它与Cygwin或多或少相同,我仍然不知道如何制作DLL。

这并不像我一直都懒惰甚至没有尝试过,只是因为这些编译器并不像我以前用过的任何东西(主要是Python IDLE和Visual Studio,它们让你很容易)。我有点迷茫。

有人可以给我一些关于如何使用这个工具来制作我可以从另一个脚本访问的DLL的建议吗?这非常重要。

先谢谢你。


6534
2017-07-17 01:30


起源



答案:


您必须将__declspec(dllexport)放在要导出的方法的前面,例如,您可以#define这个以便更容易

EXPORT_DLL void hello() { ... }

编译dll使用

gcc -c -mno-cygwin mydll.c
gcc -shared -o mydll.dll mydll.o -Wl,--out-implib,libmylib.dll.a

然后附上

gcc -o myexe.exe test.o mydll.dll

编辑:忘记最重要的部分,您需要创建一个mydll.h文件以包含您的方法定义,以便编译器知道为链接器保留一个位置以便稍后填写。这很简单

#ifndef MYDLL_H
#define MYDLL_H

extern "C" __declspec(dllexport)
#define EXPORT_DLL __declspec(dllexport)

EXPORT_DLL void hello();

#endif

13
2017-07-17 01:38



不是那样的 __declspec 不 __delspec? - R..
extern“C”__ declspec(dllexport) - Osama Javed
感谢大家捕捉到这一点,在写作时写错了。 - Jesus Ramos
如果你在cygwin的gcc上尝试这个,你最终会得到与cygwin1.dll链接的DLL,如果EXE不是,那就是谋杀。使用-m-no-cygwin(或者它是-mno-cygwin)作为gcc的一个选项来避免这种情况。 - Joshua
-mno-cygwin 是正确的,Cygwin和MinGW链接器都支持这个选项,即使它对于独立的MinGW安装来说是多余的,因为MinGW是默认目标而不是Cygwin。 - Chrono Kitsune


答案:


您必须将__declspec(dllexport)放在要导出的方法的前面,例如,您可以#define这个以便更容易

EXPORT_DLL void hello() { ... }

编译dll使用

gcc -c -mno-cygwin mydll.c
gcc -shared -o mydll.dll mydll.o -Wl,--out-implib,libmylib.dll.a

然后附上

gcc -o myexe.exe test.o mydll.dll

编辑:忘记最重要的部分,您需要创建一个mydll.h文件以包含您的方法定义,以便编译器知道为链接器保留一个位置以便稍后填写。这很简单

#ifndef MYDLL_H
#define MYDLL_H

extern "C" __declspec(dllexport)
#define EXPORT_DLL __declspec(dllexport)

EXPORT_DLL void hello();

#endif

13
2017-07-17 01:38



不是那样的 __declspec 不 __delspec? - R..
extern“C”__ declspec(dllexport) - Osama Javed
感谢大家捕捉到这一点,在写作时写错了。 - Jesus Ramos
如果你在cygwin的gcc上尝试这个,你最终会得到与cygwin1.dll链接的DLL,如果EXE不是,那就是谋杀。使用-m-no-cygwin(或者它是-mno-cygwin)作为gcc的一个选项来避免这种情况。 - Joshua
-mno-cygwin 是正确的,Cygwin和MinGW链接器都支持这个选项,即使它对于独立的MinGW安装来说是多余的,因为MinGW是默认目标而不是Cygwin。 - Chrono Kitsune