尝试使用 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。