我想在我的C代码中使用外部库(这里是(高精度算术)库MPIR,但我想这个问题也适用于其他库),这是通过Matlab从MEX调用的。为此,我使用MinGW通过命令make,make install和make check来构建MPIR,这样做没有错误(尽管如此我还不能确定所有库是否都在正确的位置(参见下面描述的文件的位置) - 怎么能我测试了吗?)。现在我用头文件myfile.h设置了一个小的测试程序myfile.cpp,如下所示:
// this is myfile.cpp
#include "mex.h"
#include "mpir.h"
#include "myfile.h"
#include <stdio.h>
void myfile(double a)
{
mpf_t b;
mp_bitcnt_t bct = 350;
double f = 10.0, g = 3.0;
mpf_set_default_prec(bct);
mpf_init(b);
mpf_set_d (b, f);
gmp_printf("b is %.*Ff \n",120,b );
mpf_clear(b);
}
其中各种调用引用MPIR库的高精度类型,带头文件
// this is myfile.h
#include "mex.h"
#include "mpir.h"
#include <stdio.h>
void myfile(double a);
我希望通过mex文件mexlib.cpp调用此例程,其中包含:
// this is mexlib.cpp
#include "mex.h"
#include "mpir.h"
#include "myfile.h"
#include <stdio.h>
void mexFunction(
int nlhs,
mxArray *plhs[],
int nrhs,
const mxArray *prhs[]
)
{
double a;
a = mxGetScalar(prhs[0]); /* create pointer to the real data in the input arguments */
myfile(a); /* call the computational routine */
return;
}
MPIR基目录是C:/MPIR/mpir-2.7.0/,在其中我可以看到文件mpir.h,gmp.h,libmpir.la等等,以及文件夹/.libs/, / mpf /,/ mpz /等。在/.libs/文件夹中,有libmpir.la,libmpir.dll.a,libmpir-16.dll,libmpir-3.dll.def等文件,但是例如。没有文件“libmpir.a”或libmpirdll.a“,这是我在这里学习其他一些问题时所寻求的。
在Matlab中,我尝试使用命令
通过mex编译它
mex -IC:/MPIR/mpir-2.7.0/-LC:/MPIR/mpir-2.7.0/.libs mexlib.cpp myfile.cpp -v或
mex -IC:/MPIR/mpir-2.7.0/-LC:/MPIR/mpir-2.7.0/ mexlib.cpp myfile.cpp -v。
它回答错误说明:
"myfile.obj : error LNK2019: unresolved external symbol __imp___gmpf_clear referenced in function "void __cdecl myfile(double)" (?myfile@@YAXN@Z)"
和myfile.cpp中调用的其他函数的类似行,和 退出
"mexlib.mexw64 : fatal error LNK1120: 5 unresolved externals."
在mex documentation中,我读到标志-L和-l指向文件以.lib结尾的位置(在Windows上)。
如何将其指向“.h”文件 - 或者它不是我需要的?我试图添加一些路径到PATH环境变量,也是MinGW路径,这没有帮助
它是一台Windows 7 PC,Matlab找到的唯一编译器是Microsoft SDK 7.1。使用-v标志显示为“COMPILER = cl”...这是SDK吗?某处还有gcc(我想在MinGW文件夹中?)
我想我对C和编译器选项中的所有#includes,头文件结构感到困惑;那么,对我来说最大的帮助就是需要哪一个(最好用一个例子)
提前谢谢!