所以,我有一个调用我的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选项是出。
答案 0 :(得分:2)
在previous post中,您提到您决定使用Visual C ++编译GSL库,使用Brian Gladman提供的VS解决方案。
以下是如何构建一个链接GSL库静态的MEX函数的分步说明:
C:\gsl-1.16
C:\gsl-1.16\build.vc11
。C:\gsl-1.16\build.vc11\gsl.lib.sln
platform=x64
和mode=Release
gslhdrs
项目cblas.lib
中的两个静态库gsl.lib
和C:\gsl-1.16\lib\x64\Release
(以及相应的PDB调试符号)。它还将创建一个包含最终头文件的目录:C:\gsl-1.16\gsl
接下来我们继续构建一个MEX函数。采用以下简单程序(从贝塞尔函数计算一些值,并将其作为输出返回):
#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。)