我正在尝试制作一个通过Matlab Engine与 Matlab 接口的 C 程序,它还通过Glut使用 OpenGL 。我已经成功编译并运行了执行这些操作之一的 C 程序(Matlab 引擎或 Glut),但是我在编译同时使用这两者的程序时遇到了问题。
特别是,我在 gcc 中使用了以下命令:gcc -o test test.c -I/Applications/MATLAB_R2014a.app/extern/include/ -framework GLUT -framework OpenGL
. -I 标志是告诉链接到 engine.h 和 matrix.h 头文件所在的目录。编译器抱怨 Matlab 引擎和矩阵库函数是未定义的符号:
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 引擎和 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. */
}