我想在我的C++代码中使用从Matlab C / C++ Coder生成的代码。
Matlab以正确的方式创建文件,并附带一个Makefile来创建库。我认为,我以正确的方式在我的Makefile中链接了库,但是它仍然抛出错误:
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。所以那应该是正确的
我是否必须以其他方式调用这些函数,因为它们是外部函数?
文件libMat.h当然是在libMat.cpp中实现的,该文件在链接的库中编译。但是我不能更改Matlab(libMat等)生成的代码
可以排除32/64 Bit Stuff的问题,因为我在与构建自己的项目相同的机器上构建库。
怎么了?
最佳答案
做了
main: $(OBJECTS)
$(CC) -o main $(OBJECTS) $(LIBS) # LIBS at the end
对于
ld
和静态库,这是一件很有趣的事情:它仅从链接过程中该阶段认为需要的.o
中选择那些.a
文件。如果更高版本的对象(在这种情况下为main.o
)引入了新的依赖关系,则不会回过头来在较早的库中查找它们。