2014-10-06 93 views
0

我想通过Matlab Engine制作一个与Matlab接口的C程序,它也通过Glut使用OpenGL。我已经成功地编译并运行了C程序来完成这些工作(Matlab Engine或Glut),但是我在编译使用这两个程序的程序时遇到了麻烦。链接头文件:Matlab引擎和OpenGL

特别是,我使用以下命令与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文件。我现在不需要特别做任何事情。首先,我只想看看我是否可以使用Matlab Engine和OpenGL编写一个C程序。

#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. */ 
} 

回答

0

您有链接错误。你需要告诉gcc你的程序试图调用的包含MATLAB函数的文件的名称和位置。您可以添加指定目录的-L选项,然后添加指定文件的-l选项。

例如,如果所需的库是/Applications/MATLAB_R2014a.app/extern/lib/libengine.dylib,那么您将在编译命令中添加-L/Applications/MATLAB_R2014a.app/extern/lib -lengine

这类事情很快就会变老,所以通常会写一个脚本 - 或者更好的Makefile--所以你不必每次都重新输入所有这些乱七八糟的东西。

+0

谢谢,这工作。我需要的库是libeng.dylib和libmx.dylib,位于/Applications/MATLAB_R2014a.app/bin/maci64。我必须使用-leng和-lmx标志链接到它们,因为我认为gcc会自动将'lib'放在库的前面并寻找相关的扩展名(例如eng - > libeng.dylib)。总之,这是我编译上述代码的方法:'gcc -o test test.c -I/Applications/MATLAB_R2014a.app/extern/include/-L/Applications/MATLAB_R2014a.app/bin/maci64 -leng -lmx - 框架GLUT -framework OpenGL' – 2014-10-07 13:46:24