Проблемы со связыванием сгенерированной Matlab библиотеки C ++

Я хочу использовать код, сгенерированный из Matlab C / C ++ Coder, в моем коде 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

Makefile:

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, вероятно, может быть исключена, потому что я собираю библиотеку на той же машине, что и свой собственный проект.

Что случилось?

1

Решение

Сделай это

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

Это забавная вещь с ld и статические библиотеки: он выбирает только те .o файлы из .a что он думает, что это нужно на этом этапе в процессе связывания. Если позже объекты (main.o в этом случае) вводите новые зависимости, они не возвращаются, чтобы искать их в более ранних библиотеках.

1

Другие решения


По вопросам рекламы [email protected]