2017-05-24 14 views
1

옥타브 스크립트를 Qt GUI 응용 프로그램에서 실행하고 싶습니다. (예 docs에서 가져온 것입니다) 여기QT의 옥타브 : 정의되지 않은 참조

... 
win32 { 
    INCLUDEPATH += c:/Octave/Octave-4.2.1/include/octave-4.2.1/octave 

    LIBS  += c:/Octave/Octave-4.2.1/lib/octave/4.2.1/liboctave.dll.a \ 
        c:/Octave/Octave-4.2.1/lib/octave/4.2.1/liboctinterp.dll.a 

    DEPENDPATH += c:/Octave/Octave-4.2.1/bin 
} 
... 

.cpp 파일 : 여기

.pro 파일입니다

나는 다음과 같은 한 Qt는 창조주로부터 C++ 코드를 컴파일하려고
#include <iostream> 
#include <octave/oct.h> 
#include <octave/octave.h> 
#include <octave/parse.h> 
#include <octave/interpreter.h> 

int 
main (void) 
{ 
    string_vector argv (2); 
    argv(0) = "embedded"; 
    argv(1) = "-q"; 

    octave_main (2, argv.c_str_vec(), 1); 

    octave_idx_type n = 2; 
    octave_value_list in; 

    for (octave_idx_type i = 0; i < n; i++) 
    in(i) = octave_value (5 * (i + 2)); 

    octave_value_list out = feval ("gcd", in, 1); 

    if (out.length() > 0) 
    std::cout << "GCD of [" 
       << in(0).int_value() 
       << ", " 
       << in(1).int_value() 
       << "] is " << out(0).int_value() 
       << std::endl; 
    else 
    std::cout << "invalid\n"; 

    clean_up_and_exit (0); 
} 

오류 :

undefined reference to feval(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, octave_value_list const&, int) 

나는 또한

undefined reference to Array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::nil_rep() 
undefined reference to Array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::resize_fill_value() const 
undefined reference to Array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::resize_fill_value() const 

을하지만 난 Ctrl 키 + Array 또는 feval를 클릭 할 때 - Qt는 창조주는 해당 파일을 엽니 다 : 컴파일러에서 오류를 다음과 같습니다.

나는 또한 옥타브 GUI에서 다음 명령을 사용하여 ++ 파일 C 예제를 컴파일 할 수

mkoctfile --link-stand-alone embedded.cc -o embedded 

어떻게 라이브러리/경로를 추가해야합니까?

대단히 감사합니다.

+0

Octave 도움말 메일 링리스트에 크로스 포스팅 : http://octave.1599824.n4.nabble.com/QT-undefined-reference-to-feval-td4683465.html – Andy

답변

0

gcd 함수가 존재하지 않거나 그것에 대한 참조를 찾을 수 없다는 오류가있는 것으로 보입니다. 나는 그것이 옥타브의 일부인지 아니면 사용자 정의 된 것이 든 상관없이 gcd 기능을 모르지만, 확실히 그것에 대한 참조가 누락되었습니다. 위에서 예에 mkoctfile 실행하면

+0

_Octave-interpreter_ 오류가 아닌 _c-compiler_ 오류이기 때문에 그렇게 생각하지 않습니다. 'gcd' 함수는 Octave에 존재합니다 - 가장 큰 공약수를 계산합니다. 어쨌든 고맙습니다. @ i1787 – pau

2

(나는 main.cc로 복사) 자세한 정보와 함께, 당신은 필요한 모든 플래그를 볼 수 있습니다 :

mkoctfile -v --link-stand-alone main.cc 
g++ -std=gnu++11 -c -fPIC -I/usr/local/include/octave-4.2.0/octave/.. -I/usr/local/include/octave-4.2.0/octave -I/usr/local/include -pthread -fopenmp -g -O2 main.cc -o main.o 
g++ -std=gnu++11 -I/usr/local/include/octave-4.2.0/octave/.. -I/usr/local/include/octave-4.2.0/octave -I/usr/local/include -pthread -fopenmp -g -O2 -rdynamic -fPIC  main.o -L/usr/local/lib/octave/4.2.0 -L/usr/local/lib -loctinterp -loctave 

지금 당신은 당신의 QtCreator에 추가해야합니다. (-std = gnu ++ 11이 누락 된 것 같습니다)

+0

, 여기'mkoctfile -v'의 결과입니다 : 'g ++ -std = gnu ++ 11 -c -pthread -fopenmp -mieee-fp -g -O2 mbedded.cc -o embedded.o'
'g ++ -std = gnu ++ 11 -pthread -fopenmp -mieee-fp -g -O2 -Wl, -rpath-link, -Wl, -export-all-symbols -o 임베디드 끼워 넣기 .o ' – pau

+0

및 Qt 작성자 : 'g ++ -c -pipe -fno-keep-inline-dllexport -g -std = gnu ++ 11 -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_QML_DEBUG - \ debug \ main.o .. \ .. \ .. \ moex \ octatest \ main.cpp' 'g ++ -Wl, -subsystem, 콘솔 -mthreads -o 디버그 \ octatest.exe 디버그/main.o -LC : \ 옥타브 \ 옥타브 \ 4.2.1 \ lib \ 옥타브 \ 4.2.1 C : \ 옥타브 \ 옥타브 - 4.2.1 \ lib \ 옥타브 \ 4.2.1 \ liboctave.dll.a C : \ 옥타브 \ 옥타브 - 4.2.1 \ lib \ octave \ 4.2.1 \ liboctinterp.dll.a' – pau

+0

문제의 이유는'--export-all-symbols' 플래그라고 생각합니다. 그러나 ** 내에서'QMAKE_LFLAGS + = --export-all-symbols'을 사용하여 설정할 때.pro ** 파일에서 다음과 같은 오류가 발생합니다 :'g ++ : error : 인식 할 수없는 명령 행 옵션 --export-all-symbols' – pau