MinGW将动态库与错误名称链接起来

时间:2013-08-13 17:33:00

标签: dll mingw dynamic-linking

我使用没有MSYS的MinGW64(Windows 7),我遇到以下问题:

我有一个用C99编写的dll,它必须带有.mexw64后缀,以便Matlab可以使用它。我希望能够动态链接这个dll形成另一个dll(mexw64),但gcc不允许我直接链接。我无法进行静态链接,因为这两个dll都有许多同名的函数,可以通过在创建共享库时不导出符号来隐藏它们。

到目前为止,我已经尝试过:

  1. 使用mklink创建符号链接(具有正确的后缀和前缀)。这有效,但我无法从makefile运行mklink。也许是因为我没有使用可能有ln -s的MSYS(我还没检查过)。
  2. 执行第一个dll的副本并更正后缀和前缀。这比我预期的要好,因为在运行时第二个dll实际上使用原始的.mexw64而不是dll副本。我想这只是因为首先找到.mexw64,但为什么首先搜索.mexw64?系统如何知道它实际上是一个DLL?
  3. 我的问题是,这是否正确/足够安全?还有其他选择吗?

    感谢您的评论。

1 个答案:

答案 0 :(得分:1)

您应该构建一个正确的implib,作为链接器输出或来自.def。

链接:

$ gcc -shared -o testimpl.mexw64 testimpl.c -Wl,--out-implib,libtestimpl.a
$ dlltool -I libtestimpl.a 
testimpl.mexw64

create a .def file,指定明确的LIBRARY

$ cat testimpl.def
LIBRARY testimpl.mexw64
EXPORTS
    test @1
$ dlltool -d testimpl.def -l libtestimpl.a
$ dlltool -I libtestimpl.a 
testimpl.mexw64

最后,链接东西:

$ gcc -o test.exe test.c libtestimpl.a
# or
$ gcc -o test.exe test.c -L. -ltestimpl

$ grep testimpl.mexw64 test.exe
Binary file test.exe matches