octaveのコンパイルオプション

このQ&Aのポイント
  • MATLABクローンのoctaveをC++ライブラリとして利用する方法について
  • g++コンパイルエラーの解決方法について知りたい
  • redhat linux 7.3でのoctaveコンパイルの問題
回答を見る
  • ベストアンサー

octaveのコンパイルオプション

MATLABのクローンのoctaveを, C++のライブラリとして利用したいと考えているのですが, コンパイルが上手くいきません. プログラムは以下のような単純なものです. --------- begin of hello.cpp ------------------ #include<iostream> #include<octave/config.h> #include<octave/Matrix.h> int main(){ Matrix m(2,2,1.0); cout<<"hello octave !"<<m; return 0; } --------- end of hello.cpp -------------------- 次のようなコンパイルオプションでコンパイルしています. > g++ -I/usr/include/octave-2.1.35/ -L/usr/lib/octave-2.1.35 \ -loctave -lcruft -loctinterp -lreadline -lcurses -llapack \ -lblas -ldl -lg2c -L/home/pippin/name/.redhat/SOURCES/octave-2.1.35/kpathsea \ -lkpathsea hello.cpp すると,次のようなエラーメッセージを返されます. /tmp/ccuvk2IV.o: In function `main': /tmp/ccuvk2IV.o(/text+0x2c): multiple definition of `main' /usr/lib/gcc-lib/i386-redhat-linux/2.96/libg2c.a(main.o)(.text+0x0): first definition here /usr/bin/ld: Warning: size of symbol `main' changed from 58 to 174 in /tmp/ccuvk2IV.o collect2: ld returned 1 exit status エラーメッセージから解するに,libg2c.aでもmain関数が定義されているため, hello.cppのmain関数とかぶるという様な事だと思うんですが,ライブラリに main関数が定義されているというのも変な話です. ちなみに,コンパイルした環境は, OS: redhat linux 7.3 octave version 2.1.35 gcc version 2.96 このタイプのエラーを回避する方法を知っておられる方は, 回答の方よろしくお願いします.

  • bilbo
  • お礼率57% (11/19)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

その後、試してみた結果、私の環境(FreeBSD-4.4)では、 g++ -I/usr/local/include/octave-2.1.30 hello.cpp -L/usr/local/lib/octave-2.1.30 -loctave -lcruft -lg2c でコンパイルでき、実行もできました。 hello.cppを後ろにもっていくと、メッセージは違いますがエラーでコンパイルできませんでしたので、順序は重要だと思います。 g2cは必要なようですね。

bilbo
質問者

お礼

返答が遅れてすいませんでした. ありがとうございます. 回答して頂いたとおり,hello.cppを-Lオプションの前に持ってくる事で, コンパイルから実行まで出来るようになりました. ところで,この様なコンパイラのリンクオプションの記述の前後関係に ついてですが,-Lオプションは,-Lを指定した以降に記述した ファイルやリンクにのみ有効になるため,という解釈でいいんでしょうか? gccのman(www.linux.or.jp/JM/)を見たところ, 特にそのような記述はなかった様にも思いますが.

その他の回答 (2)

回答No.3

たしかにマニュアルには明確な記述はないですね。 でも経験上、-Lは以降の-lにしか効きません。(ソースファイル、オブジェクトファイルのサーチには影響しません) またオブジェクトやライブラリの指定順序は、関数名の重複がある場合などには重要です。

bilbo
質問者

お礼

御礼が遅れてすいませんでした.

回答No.1

octaveとC++との結合や、linuxは使ったことがないのですが、まずは -l* をhello.cppの後ろに持ってくるとどうなりますか? それから、libg2cはg77用のライブラリだとおもいますが、フォートランのライブラリをリンクする必要性がわかりません。単純にはずしてみたらコンパイルできたりしないでしょうか? いずれも試していないので自信なしです。

関連するQ&A

  • コンパイルすると『breakの位置が誤っている』『elseの位置が誤っている』となるのは何故?

    C言語初心者です。 テキストを真似たつもりで自作してみましたが、コンパイルすると下記のようにエラーが出ます。 エラー E2030 hello.cpp 11: break の位置が誤っている(関数 main() ) エラー E2054 hello.cpp 12: else の位置が誤っている(関数 main() ) エラー E2030 hello.cpp 14: break の位置が誤っている(関数 main() ) 特に問題はないように思うのですが。何故でしょうか? 解説宜しくお願いします。 #include <stdio.h> int main(void) { int a; a = getchar(); if(a == 9) printf("入力値は%dです。\n",a); break; else printf("入力値は9ではなく %dです。\n",a); break; }

  • bcpadでコンパイルできない

    この前学校でbcpadをつかった授業があったので家でやってみようと思い、 Borland C++ Compiler 5.5 とCPad for Borland C++Compiler をインストールして設定もしました。 そしてbcpadに #include<stdio.h> int main(void){ printf("Hello World"); return 0; } と入力し、保存してコンパイルしてみました。 しかし、以下のようなエラーメッセージが出ました。 「コンパイルに失敗しました ファイル"C:Users\aaaa\downloads\Documents\C\hello.exe" は存在しません」 また下のメッセージのところには hello.cpp: Error E2379 hello.cpp 7: Statement missing ; in function main() *** 1 errors in Compile *** と出ていました。 何がダメなのか全くわかりません。 OSはwindows7です。 どなたか詳しい方ご教授をお願いします。

  • Cコンパイルエラーについて

    ◆OS Solaris 8 4/01 s28s_u4wos_08 SPARC ◆cソース(test.c) #include <stdio.h> int main() { printf("hello, world\n"); return 0; } ◆環境変数 PATH=/usr/sbin:/usr/bin:/usr/local/bin:/usr/sbin:/usr/css/bin:/usr/sfw/bin:/opt/sfw/bin:/usr/ccs/bin:/usr/openwin/bin:/usr/openwin/bin LD_LIBRALY_PATH=/usr/lib:/usr/local/lib:. ◆コンパイル gcc -o test -g -DDEBUGGING -fno-strict-aliasing -I/usr/local/include -L/usr/local/lib test.c -lsocket -lnsl -lmalloc -ldl -lld -lm -lcrypt -lsec -lc ◆エラー内容 ld: 重大なエラー: ライブラリ -lld: 見つかりません。 ld: 重大なエラー: ファイル処理エラー。test へ書き込まれる出力がありません。 collect2: ld はステータス 1 で終了しました 上記エラー対処方法をご教授下さい。宜しくお願いします。

  • clock関数のコンパイルエラーで

    こんにちは。 C++プログラムの実行時間計測リスト #include<iostream.h> #include<time.h> int main(void){ clock_t start_time=clock(); int i; //ココから //計測したい処理を書く //ココまで cerr<<clock()-start_time<<"マイクロ秒"<<endl; return 0; } をRedHat9上でコンパイルしようとすると $gcc -o clock clock.cc /usr/include/c++/3.2.2/backward/iostream.h:31 から include されたファイル中, clock.cc:1 から: /usr/include/c++/3.2.2/backward/backward_warning.h:32:2: 警告: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated. /tmp/ccoZe32a.o(.text+0x1c): In function `main': : undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' /tmp/ccoZe32a.o(.text+0x3b): In function `main': : undefined reference to `std::cerr' /tmp/ccoZe32a.o(.text+0x40): In function `main': : undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(long)' : collect2: ld はステータス 1 で終了しました となってしまいます。これはどうすればコンパイルできるようになるのでしょうか?

  • コンパイル

    プログラムをコンパイルしようと思い、 $ g++ -o hello hello.cpp と打つのですが、 -bash: g++: command not found と出てきて、コンパイルができません。 ためしにgccとも入れてみましたが、ダメでした。 どなたか教えて下さいm(_ _)mお願いします。

    • 締切済み
    • Mac
  • C++でコンパイルするとwarningが出ます

    C++初心者です。 C++でコンパイルすると以下のようなwarningメッセージが出るのですが、どういう意味なんでしょうか?解決策があれば教えてください。 プログラム(sample.cpp) #include <iostream.h> main(){ cout << " sample \n"; } warningメッセージ In file included from /usr/include/c++/3.3.1/backward/iostream.h:31, from sample.cpp:1: /usr/include/c++/3.3.1/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider usin g one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <s stream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated

  • 32bitでコンパイルするには

    お世話になっております。 CentOSの64ビットマシンを使っています。 C言語の簡単なサンプルとして、ポインタ変数の長さを表示するプログラム(sizeof(ポンタ変数)をprintf)を作りました。 これをコンパイルして実行すると8と表示されますので、64bitとアプリケーションとしてコンパイルされたのだろうと思います。 次に32Bitアプリケーションとしてコンパイルするために-m32オプションを付けてコンパイルしたところ、以下のとおりエラーが出てしまい困っております。 gcc -m32 -o sample sample.c /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/libgcc_s.so when searching for -lgcc_s /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/libgcc_s.so when searching for -lgcc_s /usr/bin/ld: cannot find -lgcc_s collect2: ld returned 1 exit status 解決方法について教えていただければ幸いです。 コンパイラは、gcc-4.4.7-3.el6.x86_64をインストールしています。 よろしくお願いします。

  • gccを使ってのリンク時のライブラリの指定法

    gccを使って、c++の勉強を始めようとしています。 hello.cpp(どこにでもある一行のプログラム)のコンパイルはできましたが、リンクができません。 私の機械では iostream は /usr/include/c++/3.3.2 にあります。( iostream.hは /usr/include/c++/3.3.2/backward にあります。) また、makefileにこの情報を書くには、どのように書けばよいのでしょうか。

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • VC++でコンパイルできてg++でコンパイルできない

    VC++6.0でコーディングしてコンパイル→実行できたのでLinuxにソースを移してg++でコンパイルしてみました。ところがコンパイルで (中略) InFunction 'App::App[not-in-charge]()' undefined reference to 'MyClass::MyClass[in-charge]()' と言うメッセージが表示されコンパイルできません。 ソースを簡単に書くと、 /***** main.cpp *****/ #include "App.h" App app; int main() { } /***** App.h *****/ #inndef __APP_H_ #define __APP_H_ #include "MyClass.h" class App { MyClass *obj; public: App(); }; #endif /***** App.cpp *****/ #include "App.h" App::App() { obj = new MyClass(); } /***** MyClass.h *****/ #ifndef __MYCLASS_H_ #define __MYCLASS_H_ class MyClass { public: MyClass(); } #endif /***** MyClass.cpp *****/ #include "MyClass.h" MyClass:MyClass(){} と言った具合です。エラーメッセージはAppがMyClassのコンストラクタがどういったものか判らない旨を通知しているのだと思うのですが#includeはきちんと行われているように見られます。 コンパイル順かとも考え g++ main.cpp App.cpp MyClass.cpp g++ main.cpp MyClass.cpp App.cpp と試してみましたが同様の現象です。凡ミスかとは思うのですがなかなか客観的に見られず困っています。