尝试使用 gcc 编译一个用 C 编写的简单 DLL。
尝试遵循许多教程,但即使我将文件精简到最基本的内容,也无法编译它。
test_dll.c
#include <stdio.h>
__declspec(dllexport) int __stdcall hello() {
printf ("Hello World!\n");
}
尝试使用命令编译它
gcc -c test_dll.c
失败,得到此输出
test_dll.c: In function '__declspec':
test_dll.c:3:37: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'hello'
__declspec(dllexport) int __stdcall hello() {
^
test_dll.c:5:1: error: expected '{' at end of input
}
^
gcc版本
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
这取决于您想要做什么:
然后移除
__declspec(dllexport)
和 __stdcall
。在 Linux 上,构建库的源代码不需要任何特殊内容。请注意,库在 Linux 上不是 DLL,它们被命名为 *.so
(共享对象)。您必须使用 -fPIC
进行编译并使用 -shared
进行链接才能创建 .so
文件。请使用谷歌了解更多详细信息。
安装 mingw 包(在包管理器中搜索它们)。然后,不仅仅是
gcc
,而是调用针对 windows/mingw 的交叉编译器,例如i686-w64-mingw32-gcc
。
如果您希望能够在 Windows 和 Linux 上使用相同的代码构建库,则需要一些预处理器魔法,因此
__declespec()
仅在针对 Windows 时使用。我通常使用这样的东西:
#undef my___cdecl
#undef SOEXPORT
#undef SOLOCAL
#undef DECLEXPORT
#ifdef __cplusplus
# define my___cdecl extern "C"
#else
# define my___cdecl
#endif
#ifndef __GNUC__
# define __attribute__(x)
#endif
#ifdef _WIN32
# define SOEXPORT my___cdecl __declspec(dllexport)
# define SOLOCAL
#else
# define DECLEXPORT my___cdecl
# if __GNUC__ >= 4
# define SOEXPORT my___cdecl __attribute__((visibility("default")))
# define SOLOCAL __attribute__((visibility("hidden")))
# else
# define SOEXPORT my___cdecl
# define SOLOCAL
# endif
#endif
#ifdef _WIN32
# undef DECLEXPORT
# ifdef BUILDING_MYLIB
# define DECLEXPORT __declspec(dllexport)
# else
# ifdef MYLIB_STATIC
# define DECLEXPORT my___cdecl
# else
# define DECLEXPORT my___cdecl __declspec(dllimport)
# endif
# endif
#endif
然后在要由库导出的每个声明前面加上
DECLEXPORT
,并在每个定义前面加上 SOEXPORT
。这只是一个简单的例子。
由于您是在Linux上编译,因此
gcc
以Linux为目标。
您要做的是针对 Windows 进行交叉编译。这意味着您将需要一个交叉编译器。适用于 Ubuntu Linux 的版本是 mingw。
您可以使用安装它
apt-get install gcc-mingw32
如果上述命令不起作用,请尝试以下命令
apt-get install mingw-w64
然后你可以编译
gcc-mingw32 -c test_dll.c
需要进一步编译成dll
gcc-mingw32 --shared test_dll.o -o test_dll.dll
这个 dll 就可以在 Windows 上使用了。