• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++の関数をfortranから呼びたい。(intelFortran,)

C++の関数をFortranから呼ぶ方法とエラーの解決方法

このQ&Aのポイント
  • WindowsXP上で、MinGWのC++コンパイラのg++とintelFortranのifortコマンドを使用して、FortranからC++関数を呼び出そうとしていますが、リンクできません。
  • ソースコードとして提供されたURLに従って、ifortとg++でソースコードをコンパイルしていますが、リンクエラーが発生しています。
  • リンクエラーの内容は、未解決の外部シンボルが関数で参照されていることです。エラーの解決方法を教えてください。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.11

そうなると, 「不可能かもしれない」としか言いようがない.

yuki7091
質問者

お礼

ご回答、有難うございます。 そうですか、、、 本件は現段階として「できない」ということで 質問を閉じさせて頂きます。 今まで対応していただき、 本当に有難うございました。

その他の回答 (10)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.10

ん~, 下の状況からすると link は *.a を扱えてるみたいですねぇ. どれどれ.... あ, lib で見えてるからたぶん大丈夫っぽい. で, 下のエラーそのものは libstdc++.a の中で必要なものが見つかってないってことだから (これだけやってれば, それは当然理解できるよね?) 「さらにリンクするライブラリが必要なんだ」と思って, 頑張って探せばいい. 前に g++ の -v オプションを書いたけど, あの出力は参考になるはず. ただ, 前者のエラーが出続けているのはなんでだろう. link と ld の, *.a の扱いの差かなぁ? ifort を使わず, link /out:hello.exe helloFortran.obj funcHelloC.o C:\MinGW\lib\libstdc++.a と直接リンカを実行したらどうなりますか? あと, link /out:hello.exe helloFortran.obj funcHelloC.o C:\MinGW\lib\libstdc++.a C:\MinGW\lib\libstdc++.a と libstdc++.a をもう 1回指定したらどうなりますかね.

yuki7091
質問者

補足

ご回答ありがとうございます。 ・link /out:hello.exe helloFortran.obj funcHelloC.o C:\MinGW\lib\libstdc++.a ・link /out:hello.exe helloFortran.obj funcHelloC.o C:\MinGW\lib\libstdc++.a C:\MinGW\lib\libstdc++.a の2つを実行した場合、以下のような同じエラーが出ます。 (出力内容がかなり長いので、中略しています。) >libstdc++.a(string-inst.o) : warning LNK4078: 複数の'.text'セクションが見つかりました。 >これらは異なる属性(E0001020)を持っています。 > libstdc++.a(ios-inst.o) : warnning LNK4217: ローカルで定義されたシンボル _iobがフィクション >__ZNSt8ios_base4iniC1Evにインポートされました。 中略 >hello.exe : fatal error LNK1120 : 外部参照32が未解決です。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.9

そう, 確かに「ifort (が呼び出しているはずの link) が適切なライブラリを処理する」ようにすればいい. で, どうすればいいかは #5 にちゃんと書いてある. ところで #6 はどうなりました?

yuki7091
質問者

補足

ご回答、有難うございます。 #5でご指摘いただいたとおり、 helpでリンク、リンカの項目を 参照して、いろいろと試しましたが うまくいきませんでした。 例えば、 >ifort helloFortran.obj funcHelloC.o /Qvc8 >ifort helloFortran.obj funcHelloC.o /link C:\MinGW\lib >ifort helloFortran.obj funcHelloC.o /link C:\MinGW\lib\libstdc++.a (そもそも、使い方があっているか分かっていません) いずれの場合も、以下のエラーが出ます。 >funcHelloC.o:error LNK2019:未解決のシンボル__ZNSt8ios_base4InitD1Evが関数 >__Z41__static_initialization_and_destruction_Oiiで参照されました。 >funcHelloC.o:error LNK2019:未解決のシンボル__ZNSt8ios_base4InitC1Evが関数 >__Z41__static_initialization_and_destruction_Oiiで参照されました。 >funcHelloC.o:error LNK2019:未解決のシンボル__ZNKSsixEjが関数 >__ZSt17__verify_groupingPKcjRKSsで参照されました。 >funcHelloC.o:error LNK2019:未解決のシンボル__ZNKSsizeEvが関数 >__ZSt17__verify_groupingPKcjRKSsで参照されました。 そして、すべてにこちらのwaringが出ています。 (warningで言っているように、「.o」オブジェクトファイルでなく、 「.obj」ファイルでないと駄目なんでしょうか?) >ifort : command line warning #1016:認識できないソースの型'funcHelloC.o'です。 >オブジェクト・ファイルと仮定されます。 また、 >ifort helloFortran.obj funcHelloC.o /link C:\MinGW\lib\libstdc++.a の実行では、上記のエラーに加えて、たくさんの外部シンボル未解決のエラーが出ています。 以下はその一部です。 >libstdc++.a(eh_globals.o):error LNK2001:外部シンボル__gthr_win32_onceは未解決です。 >libstdc++.a(local_init.o):error LNK2001:外部シンボル__gthr_win32_onceは未解決です。 >libstdc++.a(eh_gloabals.o):error LNK2019:未解決のシンボル__w32_sharedptrが関数 >__Z16get_globals_initvで参照されました。 そもそも、windows上で.oファイルをifortを実行することは 無理なのでしょうか。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.8

あ~, 前のとき最後に「結論的には」と書いたから混乱しちゃった? もしそうなら, こちらの言葉が足りなかったので混乱させちゃったんだと思います. ごめんなさい. あのときの「結論的には」は, 「『-lstdc++ が認識されなかったのは』結論的には」というつもりでした. で, 今の場合は「C++ の標準ライブラリにあるもの」と「ないもの」の両方でエラーが出ています. 「あるもの」の方は基本的に #7 への補足に書かれている方針で OK. 「ないもの」については前回の #1 の回答が参考になるはずです. 念のため書いておきますが, > c++ライブラリがないから、「_FUNCHELLOCが参照できない」 ということではないです. そのようなシンボルは C++ のライブラリには (まず間違いなく) 存在しないことでしょう.

yuki7091
質問者

補足

ご回答、有難うございます。 >「C++ の標準ライブラリにあるもの」と「ないもの」の両方でエラーが出ています。 というご指摘を頂いて、なんとなく分かりました。 「ないもの」に対するエラー出力は、 >helloFortran.obj:error LNK2019: 未解決のシンボル_FUNCHELLOCが関数_MAIN__で >参照されました。 のメッセージであると思い、ソースを見返し修正したところ、 このエラーメッセージは出力されなくなりました。 (修正箇所は、C++ソースの関数名を  funchelloc_ からFUNCHELLOCに変更しました。) 「C++ の標準ライブラリにあるもの」に対するエラー出力は、 以下のメッセージだと考えています。 >funcHelloC.o:error LNK2019:未解決のシンボル__ZNSt8ios_base4InitD1Evが関数 >__Z41__static_initialization_and_destruction_Oiiで参照されました。 >funcHelloC.o:error LNK2019:未解決のシンボル__ZNSt8ios_base4InitC1Evが関数 >__Z41__static_initialization_and_destruction_Oiiで参照されました。 >funcHelloC.o:error LNK2019:未解決のシンボル__ZNKSsixEjが関数 >__ZSt17__verify_groupingPKcjRKSsで参照されました。 >funcHelloC.o:error LNK2019:未解決のシンボル__ZNKSsizeEvが関数 >__ZSt17__verify_groupingPKcjRKSsで参照されました。 ifortがC++ライブラリを参照できるようにすることができれば、 このエラーはなくなると思っています。 そこでifortがライブラリを使用するために、何か参考になるページや アドバイスを教えて頂けませんでしょうか。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.7

質問の意図はもちろん質問をした当人にしかわからないわけだが, そこを認識したうえであえていわせてもらうなら, #5 への補足に書いてある内容は #5 でなされた質問の答になっていない... というか, おそらく #5 はそんなことを想定していないと思う. #5 では 2つのエラーメッセージを並べた上で「意味は同じ」「でも違うところもある」と言っているわけだから, 「2つのメッセージでどこが違うのかを理解しろ」ということだと思うんだけど.... 的を外しているなら突っ込み歓迎>kmeeさん.

yuki7091
質問者

補足

ご回答、ありがとうございます。 すみません、本件についてまだまだ分かっていません。 #5について、再度考えますと、 前回の問題も、今回の問題も、 g77やifortからc言語で作った関数が参照できないから リンクエラーを出している、と認識しています。 前回の場合は、古いg77から新しいg77を使用することで リンクできました。 このとき、古いg77の持っているライブラリ群に c++のライブラリがなかったのが原因だったと思います。 つまり、新しいg77には、c++のライブラリがあったから リンクできた、と認識しています。 (この認識が間違っていたら、指摘してください。) そして、前回の問題を踏まえると、今回のifortも c++ライブラリがないから、「_FUNCHELLOCが参照できない」 と言われているのではないかと思っています。 そうすると、 ・ifortのデフォルトで参照するライブラリ群のあるフォルダはどこか、 ・ifortはデフォルトでどんなライブラリをもっているか、 ・持っていないライブラリをifortが認識させるにはどうすればよいか、 ということが調べれば宜しい出のでしょうか。 本当に分かっていないので、いろいろと突っ込んでください。 お願いします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

そもそも link って .a を処理できるんだっけ?

yuki7091
質問者

補足

ご回答有難うございます。 確かに、「オブジェクトファイルではありません」と 出力されていたと思います。 ということは、「.a」のファイルは認識しないのかも? 確認してみます。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

まずは、ifortのマニュアルをよく読んでください。 特に、今回のことなら「リンク」「リンカオプション」とかいう項目を重点的に。 たしか、ライブラリファイルを直接指定してリンクするときは、オプションは必要なかったように思います。 >helloFortran.obj:error LNK2019: 未解決のシンボル_FUNCHELLOCが関数_MAIN__で参照されました。 http://oshiete1.goo.ne.jp/qa5807999.html このときは > helloFortran.o(.text+0x51):helloFortran.f: undefined reference to `funchelloc_' でしたよね。 undefined: 未定義→故に解決できない reference: 参照 ということで、言い回しこそ違いますが、同じエラーです。 では、(コンパイラの種類以外の)違いはなんでしょうか?

yuki7091
質問者

補足

ご回答、ありがとうございます。 コンパイラ以外に違う点は、 リンカとしてifortを使っている 点でしょうか? すみません、分かっていません。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

未解決シンボルの 1つ, _FUNCHELLOC についてすらわからないとすると, かなり困った状況なんだけどなぁ. 今までの経験からどういうことか理解してください. あとの 4つは #2 で言われるように C++標準ライブラリでしょう.

yuki7091
質問者

お礼

結果から申し上げますと、リンクできませんでした。 >ifort helloFortran.obj funcHelloC.o /link の結果は、 #2でお答えした内容そのままが出力されます。 >ifort helloFortran.obj funcHelloC.o /link /lC:\MinGW\lib\stdc++ の結果は、 "LINK :warning LNK4044:オプション'/lC:\MinGW\lib\stdc++'は無効です。無視されます。" というメッセージと#2でお答えした内容が出力されます。 本当に、はまっています。

yuki7091
質問者

補足

ご回答、有難うございます。 http://www.issp.u-tokyo.ac.jp/super/manual/system-b/Intel_Fdoc100/main_for/mergedProjects/bldaps_for//common/bldaps_compile_mlang.htm こちらを参考にさせて頂くと、 >ifort helloFortran.obj funcHelloC.o /link で、_FUNCHELLOCとのリンクができるのかな、と思っています。 更に、 >ifort helloFortran.obj funcHelloC.o /link /lC:\MinGW\lib\stdc++ とすれば、c++ライブラリと呼べるのかな、と思っています。 (C:\MinGW\lib\libstdc++.aを呼びたいので。) 全く検討違いな考え方をしているのであれば、すみません。 いずれにせよ、まだ実行していないので、確認しだいご連絡します。 (ちなみにC++は経験があるのですが、fortranは使い始めて  まだ1ヶ月も経っていないレベルなので、四苦八苦しています。)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

なんで「メモを取れない」んだろうかというか, なんで「メモを取らないといけない」んだろう. よほど劣悪な環境でもなければ, 「メモを取る」必要性がないと思うんだけどなぁ. だって, 「コンパイラの出力を記録する」だけでしょ? 前も書いたような気がするんだけど「失敗に終わっています」なんて書かれても役に立たない. 何らかのエラーメッセージが出ているなら, それをきちんと書いてください. 「linkというコマンドも試してみました」だって, 「どのように実行したのか」もなければ「どのような結果になったのか」もないので, 判断のしようがありません. あと, IntelFortran のコマンドラインオプションは知らないけど, ifort helloFortran.obj funcHelloC.o -lstdc++ というのはどこに書いてあったんでしょうか?

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

これまでのように、ファイルを分割した場合、全部の関数とか変数とかがオブジェクトファイルに存在しない、ということにないます。 例: helloFortran.o の中に funchelloc は無い そこで、とりあえず必要な名前(シンボル)のテーブルを作っておいて、実行ファイルにする段階で、他のオブジェクトファイルや、(オブジェクトファイルの集りである)ライブラリと照し合わせて、結びつける(リンクする)のが「リンカ」です。 例: helloFortran.o の中の funchelloc と funcHello.oの中のfunchellocとを結びつける で、件のエラーは、オブジェクトにもライブラリにも、シンボルの参照先に使えるものが見付からなかった、ということです。 そのシンボルにあたるものが入っているライブラリをリンクすればよいのですが、シンボルがわからないので、対応ライブラリもわかりません。 (過去の質問からして、C++標準ライブラリではないか、と予測はできますが) これまでの質問も同じところ、リンカでのエラーや警告です。 いろいろ試すのもよいですが、その前に、コンパイラの動作、特にリンカに関することをよく勉強してからにしませんか? あと、いろんなコンパイラをばらばらに使うのは、混乱の元です。 よくわからないうちは、一つの系列(GCCならgcc,g++,g77.../MS系ならVC / インテル系ならicc.ifort)、一つのバージョンに絞りましょう。

yuki7091
質問者

補足

ご回答、有難うございます。 intelFortranがのっている別マシンで出力結果を確認しました。 (コピー&ペーストでなく手書きで書いているので、  若干のミスがあるかもしれません。) >ifort helloFortran.obj funcHelloC.o ifort: command line warning #10161: 認識できないソースの型'funcHelloC.o' です。オブジェクトファイルであると仮定されます。 -out:helloFortran.exe -subsystem:console helloFortran.obj funcHelloC.o helloFortran.obj:error LNK2019: 未解決のシンボル_FUNCHELLOCが関数_MAIN__で参照されました。 funcHelloC.o:error LNK2019:未解決のシンボル__ZNSt8ios_base4InitD1Evが関数__Z41__static_initialization_and_destruction_Oiiで参照されました。 funcHelloC.o:error LNK2019:未解決のシンボル__ZNSt8ios_base4InitC1Evが関数__Z41__static_initialization_and_destruction_Oiiで参照されました。 funcHelloC.o:error LNK2019:未解決のシンボル__ZNKSsixEjが関数__ZSt17__verify_groupingPKcjRKSsで参照されました。 funcHelloC.o:error LNK2019:未解決のシンボル__ZNKSsizeEvが関数__ZSt17__verify_groupingPKcjRKSsで参照されました。 helloFortran.exe: fatal error LNK1120:外部参照5が未解決です。 ご指摘頂いたように、いろんなコンパイラを使用しているので 少々混乱しています。 しかしながら、いろんなコンパイラで実行するとどうなるか 試してみたく、今回質問させて頂きました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

その「未解決の外部シンボル」とやらが解決できるように, 何かを追加すればいいのでは? 何を追加すればいいのかは知らんので, 自分で調べてくれ. 「お手数ですが、よろしくお願いします。」と書くくらいなら, 自分でどこまで調べたのかを書く方が印象がいいと思うよ. もっとはっきり言うと, これまでの質問を見るとあなたは「分からないことを自分でまったく調べない」ように見えてしまう.

yuki7091
質問者

補足

ご回答有難うございます。 調べているのですが、なかなか自分のほしい解答を見つからなかったため、 本サイトを利用させて頂いております。 (個人的なことですが、intelFortranが動いているマシンが  外部に接続できる環境にないため、詳細なことを  書けずに質問してしまいました。) また、メモを取れないので、うろ覚えで書きますと LNK2019のエラーで「funchelloがmainで参照された」というものを含め計5つと、 LNK1120のエラー「外部参照が5つあります」、 みたいな事をいわれました。 リンクエラーだと思って、 >ifort helloFortran.obj funcHelloC.o -lstdc++ をやってみたり(失敗に終わっています。) >ifort helloFortran.obj funcHelloC.o -lstdc++ -LC:\MinGW\lib をやってみたりしています。(失敗に終わっています。) (マニュアルで掲載されていたlinkというコマンドも試してみました。) 本件とはちょっと反れますが、リンクが成功する >f77 helloFortran.obj funcHelloC.o -lstdc++ をやった場合、C:\MinGW\lib内のlibstdc++.aを 見に行っているのでしょうか?

関連するQ&A