我在Linux(CentOS 6.7)上使用MXE(Linux上的MinGW交叉编译环境)静态工具链创建了一个DLL。如果它没有与glib链接,一切看起来都很好。但是,如果它与glib链接,dumpbin /exports libtest.dll
仅显示glib中的符号(前缀为g_
,例如g_int_equal
)。
例如,小测试c代码
#include <glib.h>
int global_func(void)
{
int c = 0xff;
return c;
}
int local_func(int ini)
{
int a = 1, b = 2;
g_int_equal(&a, &b);
return ini + 1;
}
构建DLL的命令:
x86_64-w64-mingw32.static-gcc -c -o test.o test.c -I/home/STools/mxe/usr/x86_64-w64-mingw32.static/include/glib-2.0 -I/home/STools/mxe/usr/x86_64-w64-mingw32.static/lib/glib-2.0/include
x86_64-w64-mingw32.static-g++ -Wl,-soname,libtest.dll -Wl,--version-script=test.version -Wl,--nxcompat -Wl,--no-seh -Wl,--dynamicbase -Wl,--warn-common -m64 -g -shared -o libtest.dll test.o -lglib-2.0 -lintl -liconv -lwinmm -lws2_32 -liphlpapi -lole32
版本脚本test.version:
FOO {
global:
global_func;
local: *; # hide everything else
};
然后我将导出的符号转储到Windows中的libtest.dll中:
dumpbin /exports libtest.dll
它在glib中显示了很多函数,但没有“global_func”。
Glib这里是静态库。我还尝试了共享工具链x86_64-w64-mingw32.shared-g ++。使用静态Glib,结果是一样的。因此,当我尝试使用GetProcAddress在DLL中找到一些函数时,它会失败。 怎么了?
我还从gnome网站下载了Glib的DLL版本。现在导出的函数是正确的。