在Linux上交叉编译的DLL中没有动态符号

时间:2016-03-13 14:45:33

标签: linux dll cross-compiling

我在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版本。现在导出的函数是正确的。

0 个答案:

没有答案