2017-05-24 10 views
1

実行したいOctaveスクリプトQt GUIアプリケーションから実行します。私は、次のしているQtの創造主からのC++コードをコンパイルしようとしていた場合QTからのオクターブ:未定義参照

#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); 
} 

:ここ

... 
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ファイル(例はdocsから取られている)である:ここでは

.proファイルですエラー:

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 Creatorは適切なファイルを開きます。

私はまた、オクターブ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の機能がオクターブの一部であるかカスタム定義されているかは分かりませんが、確かにそのリファレンスはありません。

+0

_Octave-interpreter_エラーではなく、_c-compiler_エラーであるので、私はそうは思わない。関数 'gcd'はOctaveに存在します - それは最大公約数を計算します。 とにかくお答えいただき、ありがとうございます。@ i1787 – pau

2

あなたが冗長で(私はmain.ccにそれをコピーした)上からあなたの例でmkoctfile実行する場合は、必要なすべてのフラグが表示されます:

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埋め込み.o'
'g ++ -std = gnu ++ 11 -pthread -fopenmp -mieee-fp -g -O2 -Wl、-rpath-link、-Wl、--export-all-symbols -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: \ Octave \ Octave-4.2.1 \ lib \ octave \ 4.2.1 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' – pau

+0

私はこの問題の理由は '--export-all-symbols'フラグだと思いますが、私の**では' QMAKE_LFLAGS + = --export-all-symbols'を使って設定しました。pro **ファイルの場合、次のエラーが表示されます: 'g ++:error:認識できないコマンドラインオプション--export-all-symbols' – pau