链接和加载静态.lib与mex

时间:2014-07-11 18:32:37

标签: matlab visual-c++ linker static-libraries mex

所以,我有一个调用我的C源代码的MEX网关脚本文件。我使用-L和-I命令将我的64位编译的GSL库(.libs)链接到我的mex可执行文件,然后在.mexw64的扩展名下编译。

我希望将此可执行文件传输到另一台Windows计算机并运行正常,而不安装任何GSL库。这是唯一的解决方案,我不关心他在编译时动态链接/代码生成的好处。我想要一个可执行文件,它不仅具有(当然)预先声明的所有功能,而且还具有PRE-DEFINED功能。

我始终相信这就是'静态'链接是动态的;但是我已经在互联网上读到了一些矛盾的定义。我需要一个完全100%独立的单一文件。

据说你可以链接我可以生成的mex函数中的实际.obj文件,但不幸的是我得到了未解决的符号错误。

有人提到我可以使用-l(小写L)直接链接所需的实际.lib(s),但这不是真的。

那么是否有任何人可以引导我朝着正确的方向前进,或者如何让所有东西不仅链接,而且还可以在运行可执行文件时将DEFINITIONS链接并准备加载 - 完全独立,或者为什么我遇到我包含.obj文件时未解决的符号/链接器错误?我是否误解了关于链接过程的基本内容?

另外:为了详细说明,我已经通过Visual Studio为64位架构构建和链接了GSL库,我可以轻松地将它与MATLAB链接,因此这不是我的问题(不再)。

编辑:我在这里看过帖子: Generating standalone MEX file with GNU compilers, including libraries

然而,这并没有解决我的问题,尽管这是同一个问题。我无法访问gcc;它最终在MATLAB中编译MSVS12编译器,我不会尝试通过MinGW使用GCC重新编译(已经尝试过,无法解决),所以-static和.a选项是出。

1 个答案:

答案 0 :(得分:2)

previous post中,您提到您决定使用Visual C ++编译GSL库,使用Brian Gladman提供的VS解决方案。

以下是如何构建一个链接GSL库静态的MEX函数的分步说明:

  1. 下载GNU GSL来源(GSL v1.16
  2. 下载匹配的Visual Studio项目文件(VS2012 for GSL v1.16
  3. 提取GSL tarball,对C:\gsl-1.16
  4. 在源代码上提取VS项目文件,这将覆盖三个文件并添加文件夹C:\gsl-1.16\build.vc11
  5. 打开Visual Studio 2012,然后加载解决方案:C:\gsl-1.16\build.vc11\gsl.lib.sln
  6. 将配置更改为所需的输出:对我来说,我选择了platform=x64mode=Release
  7. 首先,您必须先构建gslhdrs项目
  8. 现在构建整个解决方案。这将创建存储在cblas.lib中的两个静态库gsl.libC:\gsl-1.16\lib\x64\Release(以及相应的PDB调试符号)。它还将创建一个包含最终头文件的目录:C:\gsl-1.16\gsl
  9. 接下来我们继续构建一个MEX函数。采用以下简单程序(从贝塞尔函数计算一些值,并将其作为输出返回):

    gsl_test.c

    #include "mex.h"
    #include <gsl/gsl_sf_bessel.h>
    
    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
    {
        if (nrhs != 0 || nlhs > 1) mexErrMsgTxt("Wrong number of args.");
        plhs[0] = mxCreateDoubleScalar(gsl_sf_bessel_J0(5.0));
    }
    

    这是如何在MATLAB中编译上面的C代码:

    >> mex -largeArrayDims gsl_test.c -I"C:\gsl-1.16" -L"C:\gsl-1.16\lib\x64\Release" cblas.lib gsl.lib
    

    最后,我们测试MEX文件,并将其与MATLAB自己的贝塞尔函数报告的值进行比较:

    >> x = gsl_test()
    ans =
       -0.1776
    
    >> y = besselj(0,5)
    y =
       -0.1776
    
    >> max(x-y)    % this should be less than eps
    ans =
       8.3267e-17
    

    请注意,构建的MEX函数没有外部DLL依赖项(&#34; Visual C Runtime&#34;这是预期的,以及通常的MATLAB库)。如果需要,您可以使用Dependency Walker来验证。因此,您可以单独部署gsl_test.mexw64文件(假设用户已在其计算机上安装了相应的VC++ runtime。)