0

Matlab Engineを介して Matlab とやり取りし、 Glutを介して OpenGL を利用する C プログラムを作成しようとしています。これらのいずれか (Matlab エンジンまたは Glut) を実行する C プログラムのコンパイルと実行は成功しましたが、両方を使用するプログラムのコンパイルに問題があります。

特に、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 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. */
}
4

1 に答える 1