尝试使用 gcc 编译用 C 编写的简单 dll 失败
Trying to compile simple dll written in C using gcc fails
正在尝试使用 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)
这取决于您要做什么:
1。在 linux
上为 linux 构建一个库
然后删除 __declspec(dllexport)
和 __stdcall
。在 linux 上,您在构建库时不需要任何特殊的源代码。请注意,库不是 linux 上的 DLL,它们被命名为 *.so
(共享对象)。您必须使用 -fPIC
和 link 以及 -shared
进行编译以创建 .so
文件。请使用 google 了解更多详情。
2。在 linux
上构建 windows DLL
安装 mingw 包(在包管理器中搜索)。然后,不只是 gcc
,而是调用针对 windows/mingw 的交叉编译器,例如i686-w64-mingw32-gcc
.
3。允许跨平台构建库,包括 windows
如果你希望能够从 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
然后在每个lib要导出的声明前加上DECLEXPORT
,在每个定义前加上SOEXPORT
。这只是一个简单的例子。
由于您是在 Linux 上编译,gcc
将 Linux 作为目标。
你要做的是交叉编译Windows。这意味着您将需要一个交叉编译器。 Ubuntu Linux 可用的是 mingw.
您可以使用
安装它
apt-get install gcc-mingw32
然后你可以用
编译
gcc-mingw32 -c test_dll.c
进一步编译成dll需要
gcc-mingw32 --shared test_dll.o -o test_dll.dll
此 dll 可用于 Windows。
正在尝试使用 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)
这取决于您要做什么:
1。在 linux
上为 linux 构建一个库然后删除 __declspec(dllexport)
和 __stdcall
。在 linux 上,您在构建库时不需要任何特殊的源代码。请注意,库不是 linux 上的 DLL,它们被命名为 *.so
(共享对象)。您必须使用 -fPIC
和 link 以及 -shared
进行编译以创建 .so
文件。请使用 google 了解更多详情。
2。在 linux
上构建 windows DLL安装 mingw 包(在包管理器中搜索)。然后,不只是 gcc
,而是调用针对 windows/mingw 的交叉编译器,例如i686-w64-mingw32-gcc
.
3。允许跨平台构建库,包括 windows
如果你希望能够从 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
然后在每个lib要导出的声明前加上DECLEXPORT
,在每个定义前加上SOEXPORT
。这只是一个简单的例子。
由于您是在 Linux 上编译,gcc
将 Linux 作为目标。
你要做的是交叉编译Windows。这意味着您将需要一个交叉编译器。 Ubuntu Linux 可用的是 mingw.
您可以使用
安装它apt-get install gcc-mingw32
然后你可以用
编译gcc-mingw32 -c test_dll.c
进一步编译成dll需要
gcc-mingw32 --shared test_dll.o -o test_dll.dll
此 dll 可用于 Windows。