0

我正在尝试制作一个通过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. */
}
4

1 回答 1

0

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

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

这类事情很快就会过时,所以人们通常会编写一个脚本——或者更好的是,一个 Makefile——这样你就不必每次都重新输入所有这些乱七八糟的东西。

于 2014-10-06T21:41:02.557 回答