Связывание заголовочных файлов: Matlab Engine и OpenGL
Я пытаюсь создать C-программу, которая взаимодействует с Matlab через Matlab Engine, а также использует OpenGL через Glut. Я успешно скомпилировал и запустил программы на C, которые выполняют одну из этих задач (Matlab Engine ИЛИ Glut), но у меня возникают проблемы при компиляции программы, которая использует обе.
В частности, я использую следующую команду с gcc: gcc -o test test.c -I/Applications/MATLAB_R2014a.app/extern/include/ -framework GLUT -framework OpenGL
, Флаг -I указывает ссылку на каталог, в котором находятся заголовочные файлы engine.h и matrix.h. Компилятор жалуется, что функции Matlab Engine и матрицы библиотеки являются неопределенными символами:
Undefined symbols for architecture x86_64:
"_engEvalString", referenced from:
_main in test-bae966.o
"_engGetVariable", referenced from:
_main in test-bae966.o
"_engOpen", referenced from:
_main in test-bae966.o
"_engPutVariable", referenced from:
_main in test-bae966.o
"_mxCreateDoubleScalar", referenced from:
_main in test-bae966.o
"_mxGetPr", referenced from:
_main in test-bae966.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Вот файл test.c, который я пытаюсь скомпилировать. Мне не нужно делать что-то конкретное прямо сейчас. Во-первых, я просто хочу посмотреть, смогу ли я заставить программу на C использовать и Matlab Engine, и OpenGL.
#include <GLUT/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <engine.h>
#include <matrix.h>
void display(void)
{
/* clear all pixels */
glClear(GL_COLOR_BUFFER_BIT);
/* draw white polygon (rectangle) with corners at
* (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)
*/
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_POLYGON);
glVertex3f(0.25, 0.25, 0.0);
glVertex3f(0.75, 0.25, 0.0);
glVertex3f(0.75, 0.75, 0.0);
glVertex3f(0.25, 0.75, 0.0);
glEnd();
/* don’t wait!
* start processing buffered OpenGL routines
*/
glFlush();
}
void init(void)
{
/* select clearing (background) color */
glClearColor(0.0, 0.0, 0.0, 0.0);
/* initialize viewing values */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}
/*
* Declare initial window size, position, and display mode
* (single buffer and RGBA). Open window with “hello”
* in its title bar. Call initialization routines.
* Register callback function to display graphics.
* Enter main loop and process events.
*/
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(250, 250);
glutInitWindowPosition(100, 100);
glutCreateWindow("hello");
init();
Engine *ep;
mxArray *pa = NULL, *res = NULL;
if (!(ep = engOpen(""))) {
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}
pa = mxCreateDoubleScalar(5);
engPutVariable(ep, "a", pa);
engEvalString(ep, "res = 2 * a");
res = engGetVariable(ep,"res");
int resVal = *mxGetPr(res);
printf("%d\n", resVal);
glutDisplayFunc(display);
glutMainLoop();
return 0; /* ISO C requires main to return int. */
}
1 ответ
У вас есть ошибка компоновщика. Вы должны указать gcc имя и местоположение файла (ов), содержащих функции MATLAB, которые пытается вызвать ваша программа. Вы бы добавили опцию -L, указав каталог, а затем опцию -l, указав файл.
Например, если нужной библиотекой была /Applications/MATLAB_R2014a.app/extern/lib/libengine.dylib, то вы бы добавили -L/Applications/MATLAB_R2014a.app/extern/lib -lengine
в команду компиляции.
Подобные вещи быстро устаревают, поэтому обычно пишут скрипт - или, лучше, Makefile - чтобы вам не приходилось каждый раз перепечатывать весь этот беспорядок.