1

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

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

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

  1. 使用 mklink 创建符号链接(带有正确的后缀和前缀)。这可行,但我无法从 makefile 运行 mklink。也许是因为我没有使用可能有 ln -s 的 MSYS(我没有检查过)。
  2. 复制第一个 dll 并更正后缀和前缀。这比我预期的要好,因为在运行时第二个 dll 实际上使用原始 .mexw64 而不是 dll 副本。我想这只是因为首先找到了 .mexw64,但是为什么首先搜索 .mexw64 呢?系统如何知道它实际上是一个dll?

我的问题是,这是否正确/安全?还有其他选择吗?

感谢您的评论。

4

1 回答 1

1

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

链接器:

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

或者创建一个 .def 文件,指定一个明确的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
于 2013-08-16T23:13:35.243 回答