【发布时间】:2014-09-02 11:08:08
【问题描述】:
所以,我有一个调用我的 C 源代码的 MEX 网关脚本文件。我使用 -L 和 -I 命令将我的 64 位编译 GSL 库 (.libs) 链接到我的 mex 可执行文件,然后在 .mexw64 的扩展名下编译。
我希望将此可执行文件传输到另一台 Windows 机器并运行良好,而无需安装任何 GSL 库。这是唯一的解决方案,我不在乎他关于编译时动态链接/代码生成的好处的论点是什么。我想要一个可执行文件,它的每个功能不仅(当然)预先声明,而且还预先定义。
我被引导相信这就是“静态”链接与动态链接的区别;但我在互联网上阅读了一些相互矛盾的定义。我需要一个完全 100% 独立的单一文件。
假设您可以在我可以生成的 mex 函数中链接实际的 .obj 文件,但不幸的是,我得到了未解决的符号错误。
其他人提到我可以使用 -l(小写 L)直接静态链接所需的实际 .lib,但事实并非如此。
那么有没有人可以引导我朝着正确的方向前进,或者如何不仅链接所有内容,而且还链接定义并在可执行文件运行时准备好加载 - 完全独立,或者我为什么会遇到包含 .obj 文件时未解决的符号/链接器错误?我是否误解了有关链接过程的一些基本内容?
另外:为了详细说明,我通过 Visual Studio 为 64 位架构构建和链接了 GSL 库,我可以轻松地将它与 MATLAB 链接,所以这不是我的问题(不再)。
编辑:我在这里看到了帖子: Generating standalone MEX file with GNU compilers, including libraries
然而,这并不能解决我的问题,尽管它是同一个问题。我无权访问 gcc;它终于在 MATLAB 中的 MSVS12 编译器上进行编译,我不会尝试通过 MinGW 使用 GCC 重新编译(已经尝试过,无法弄清楚),所以 -static 和 .a 选项不可用。
【问题讨论】:
-
您尝试过listing the .lib on the mex command line(即
mex -v -largeArrayDims myMexfun.cpp libgsl.lib)吗?你确定你已经构建了 GSL 静态库,而不是生成 .lib 的 dll,而只是一个存根? -
@chappjc: +1 这是一个问题,解释了链接到 DLL 的不同方式,以及导入库和静态库之间的区别:stackoverflow.com/q/3573475/97160
标签: matlab visual-c++ linker static-libraries mex