链接Matlab生成的C ++库的问题

时间:2014-12-09 11:48:28

标签: c++ matlab makefile static-libraries matlab-coder

我想在我的C ++代码中使用Matlab C / C ++编码器生成的代码 Matlab以正确的方式创建文件,并带来一个Makefile,以创建一个库。我想,我在Makefile中以正确的方式链接了库,但它仍然会抛出一个错误:

  

/HOMES/~~/testMatlab/main.cpp:11:未定义的引用`emxCreate_real_T(int,int)'

main.cpp中:

1 #include<iostream>
2 #include"libMat.h"
3 
4 using namespace std;
5 
6 int main() {
7 double iHeightAll = 100;
8 double iWidthAll = 100;
9 
10 emxArray_real_T *MatlabInput;
11 MatlabInput = emxCreate_real_T((int)iHeightAll,(int)iWidthAll);
12 return 0;
13 }

libMat.h

#ifndef __LIBMAT_H__
#define __LIBMAT_H__
/* Include files */
#include <stddef.h>
#include <stdlib.h>

#include "rtwtypes.h"
#include "libMat_types.h"

/* Function Declarations */
extern emxArray_real_T *emxCreateND_real_T(int numDimensions, int *size);
extern emxArray_real_T *emxCreateWrapperND_real_T(double *data, int numDimensions, int *size);
extern emxArray_real_T *emxCreateWrapper_real_T(double *data, int rows, int cols);
extern emxArray_real_T *emxCreate_real_T(int rows, int cols);
extern void emxDestroyArray_real_T(emxArray_real_T *emxArray);
extern double libMat(const emxArray_real_T *Pic, double height, double width);
extern void libMat_initialize();
extern void libMat_terminate();
#endif

生成文件:

1 CC=g++
2 CFLAGS=  -g
3 OBJECTS= main.o
4 LIBS = -Llibs -lMat
5 
6 # --- targets
7 all:    main
8 main:   $(OBJECTS)
9         $(CC) $(LIBS)  -o main $(OBJECTS)
10         
11 main.o: main.cpp
12         $(CC) $(CFLAGS) -Ilibs -c main.cpp
13 

库位于/ libs中,称为libMat.a。所以这一切都应该是正确的

我是否必须以任何其他方式调用这些函数,因为它们是extern? 文件libMat.h当然是在libMat.cpp中实现的,它在链接库中编译。但我不能改变Matlab(libMat等)生成的代码

可能会排除32/64 Bit Stuff的问题,因为我在构建自己项目的同一台机器上构建了库。

有什么问题?

1 个答案:

答案 0 :(得分:1)

成功

main:   $(OBJECTS)
     $(CC)  -o main $(OBJECTS) $(LIBS) # LIBS at the end

ld和静态库这是一个有趣的事情:它只从链接过程中该阶段的.o中选择它认为需要的.a个文件。如果后来的对象(在这种情况下为main.o)引入了新的依赖项,那么它就不会在早期的库中找回它们。