プロが教えるわが家の防犯対策術!

C++の関数をfortranから呼びたい。(intelFortran, g++)

いつもお世話になっています。

現在WindowsXP上で、MinGWのC++コンパイラのg++と
intelFortranのifortコマンドを使用して、
fortranからc++関数を呼ぼうとしていますが
リンクできません。

ソースは以下で紹介したものをそのまま使用しています。
http://oshiete.goo.ne.jp/qa/5806443.html

手順は、
D:\C>ifort -c helloFortran.f
D:\C>g++ -c funcHelloC.cpp
D:\C>ifort helloFortran.obj funcHelloC.o

結果は、
error LNK2019: 未解決の外部シンボル*****が関数****
で参照されました。
と数行出力されています。

お手数ですが、よろしくお願いします。

A 回答 (11件中1~10件)

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

    • good
    • 0
この回答へのお礼

ご回答、有難うございます。

そうですか、、、
本件は現段階として「できない」ということで
質問を閉じさせて頂きます。

今まで対応していただき、
本当に有難うございました。

お礼日時:2010/05/13 07:21

ん~, 下の状況からすると 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回指定したらどうなりますかね.

この回答への補足

ご回答ありがとうございます。

・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が未解決です。

補足日時:2010/05/06 07:07
    • good
    • 0

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


ところで #6 はどうなりました?

この回答への補足

ご回答、有難うございます。

#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を実行することは
無理なのでしょうか。

補足日時:2010/04/26 23:10
    • good
    • 0

あ~, 前のとき最後に「結論的には」と書いたから混乱しちゃった? もしそうなら, こちらの言葉が足りなかったので混乱させちゃったんだと思います. ごめんなさい. あのときの「結論的には」は, 「『-lstdc++ が認識されなかったのは』結論的には」というつもりでした.


で, 今の場合は「C++ の標準ライブラリにあるもの」と「ないもの」の両方でエラーが出ています. 「あるもの」の方は基本的に #7 への補足に書かれている方針で OK. 「ないもの」については前回の #1 の回答が参考になるはずです. 念のため書いておきますが,
> c++ライブラリがないから、「_FUNCHELLOCが参照できない」
ということではないです. そのようなシンボルは C++ のライブラリには (まず間違いなく) 存在しないことでしょう.

この回答への補足

ご回答、有難うございます。

>「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がライブラリを使用するために、何か参考になるページや
アドバイスを教えて頂けませんでしょうか。

補足日時:2010/04/23 01:04
    • good
    • 0

質問の意図はもちろん質問をした当人にしかわからないわけだが, そこを認識したうえであえていわせてもらうなら, #5 への補足に書いてある内容は #5 でなされた質問の答になっていない... というか, おそらく #5 はそんなことを想定していないと思う.


#5 では 2つのエラーメッセージを並べた上で「意味は同じ」「でも違うところもある」と言っているわけだから, 「2つのメッセージでどこが違うのかを理解しろ」ということだと思うんだけど.... 的を外しているなら突っ込み歓迎>kmeeさん.

この回答への補足

ご回答、ありがとうございます。
すみません、本件についてまだまだ分かっていません。

#5について、再度考えますと、
前回の問題も、今回の問題も、
g77やifortからc言語で作った関数が参照できないから
リンクエラーを出している、と認識しています。

前回の場合は、古いg77から新しいg77を使用することで
リンクできました。
このとき、古いg77の持っているライブラリ群に
c++のライブラリがなかったのが原因だったと思います。
つまり、新しいg77には、c++のライブラリがあったから
リンクできた、と認識しています。
(この認識が間違っていたら、指摘してください。)

そして、前回の問題を踏まえると、今回のifortも
c++ライブラリがないから、「_FUNCHELLOCが参照できない」
と言われているのではないかと思っています。

そうすると、
・ifortのデフォルトで参照するライブラリ群のあるフォルダはどこか、
・ifortはデフォルトでどんなライブラリをもっているか、
・持っていないライブラリをifortが認識させるにはどうすればよいか、
ということが調べれば宜しい出のでしょうか。

本当に分かっていないので、いろいろと突っ込んでください。
お願いします。

補足日時:2010/04/21 01:23
    • good
    • 0

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

この回答への補足

ご回答有難うございます。

確かに、「オブジェクトファイルではありません」と
出力されていたと思います。

ということは、「.a」のファイルは認識しないのかも?
確認してみます。

補足日時:2010/04/18 21:40
    • good
    • 0

まずは、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: 参照
ということで、言い回しこそ違いますが、同じエラーです。
では、(コンパイラの種類以外の)違いはなんでしょうか?

この回答への補足

ご回答、ありがとうございます。

コンパイラ以外に違う点は、
リンカとしてifortを使っている
点でしょうか?

すみません、分かっていません。

補足日時:2010/04/16 15:19
    • good
    • 0

未解決シンボルの 1つ, _FUNCHELLOC についてすらわからないとすると, かなり困った状況なんだけどなぁ. 今までの経験からどういうことか理解してください.


あとの 4つは #2 で言われるように C++標準ライブラリでしょう.

この回答への補足

ご回答、有難うございます。

http://www.issp.u-tokyo.ac.jp/super/manual/syste …
こちらを参考にさせて頂くと、
>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ヶ月も経っていないレベルなので、四苦八苦しています。)

補足日時:2010/04/14 01:18
    • good
    • 0
この回答へのお礼

結果から申し上げますと、リンクできませんでした。

>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でお答えした内容が出力されます。

本当に、はまっています。

お礼日時:2010/04/15 01:07

なんで「メモを取れない」んだろうかというか, なんで「メモを取らないといけない」んだろう. よほど劣悪な環境でもなければ, 「メモを取る」必要性がないと思うんだけどなぁ. だって, 「コンパイラの出力を記録する」だけでしょ?


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

これまでのように、ファイルを分割した場合、全部の関数とか変数とかがオブジェクトファイルに存在しない、ということにないます。


例: helloFortran.o の中に funchelloc は無い

そこで、とりあえず必要な名前(シンボル)のテーブルを作っておいて、実行ファイルにする段階で、他のオブジェクトファイルや、(オブジェクトファイルの集りである)ライブラリと照し合わせて、結びつける(リンクする)のが「リンカ」です。
例: helloFortran.o の中の funchelloc と funcHello.oの中のfunchellocとを結びつける

で、件のエラーは、オブジェクトにもライブラリにも、シンボルの参照先に使えるものが見付からなかった、ということです。

そのシンボルにあたるものが入っているライブラリをリンクすればよいのですが、シンボルがわからないので、対応ライブラリもわかりません。
(過去の質問からして、C++標準ライブラリではないか、と予測はできますが)

これまでの質問も同じところ、リンカでのエラーや警告です。
いろいろ試すのもよいですが、その前に、コンパイラの動作、特にリンカに関することをよく勉強してからにしませんか?

あと、いろんなコンパイラをばらばらに使うのは、混乱の元です。
よくわからないうちは、一つの系列(GCCならgcc,g++,g77.../MS系ならVC / インテル系ならicc.ifort)、一つのバージョンに絞りましょう。

この回答への補足

ご回答、有難うございます。

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が未解決です。

ご指摘頂いたように、いろんなコンパイラを使用しているので
少々混乱しています。
しかしながら、いろんなコンパイラで実行するとどうなるか
試してみたく、今回質問させて頂きました。

補足日時:2010/04/13 01:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!