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

Posted

技术标签:

【中文标题】链接 Matlab 生成的 C++ 库的问题【英文标题】:Problems Linking Matlab generated C++ Library 【发布时间】:2014-12-09 11:48:27 【问题描述】:

我想在我的 C++ 代码中使用从 Matlab C/C++ Coder 生成的代码。 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。所以应该都是正确的

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

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

怎么了?

【问题讨论】:

我会尝试在你的 main.o 规则中重用你的 $(LIBS) $(CC) $(CFLAGS) -Ilibs $(LIBS) -c main.cpp 这会产生相同的结果。错误在 g++ -Llibs -lMat -o main main.o 中抛出 【参考方案1】:

做起来

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

这对于ld 和静态库来说很有趣:它只从.a 中挑选出它认为在链接过程的那个阶段需要的那些.o 文件。如果后来的对象(在这种情况下为main.o)引入了新的依赖关系,它不会返回到早期的库中查找它们。

【讨论】:

以上是关于链接 Matlab 生成的 C++ 库的问题的主要内容,如果未能解决你的问题,请参考以下文章

怎样将matlab中的.mat 文件转换为二进制文件,输入到c++程序中使用

Matlab API 从 C++ 读取 .mat 文件,使用 STL 容器

matlab中mat文件的生成和读取

从 C++ 文件中导入 5 级 MAT 文件格式数据

MATLAB中如何建立一个Mat文件

Visual Studio中怎么生成动态链接库的lib文件