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: 未解決の外部シンボル*****が関数****
で参照されました。
と数行出力されています。
お手数ですが、よろしくお願いします。
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回指定したらどうなりますかね.
この回答への補足
ご回答ありがとうございます。
・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が未解決です。
No.9
- 回答日時:
そう, 確かに「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を実行することは
無理なのでしょうか。
No.8
- 回答日時:
あ~, 前のとき最後に「結論的には」と書いたから混乱しちゃった? もしそうなら, こちらの言葉が足りなかったので混乱させちゃったんだと思います. ごめんなさい. あのときの「結論的には」は, 「『-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がライブラリを使用するために、何か参考になるページや
アドバイスを教えて頂けませんでしょうか。
No.7
- 回答日時:
質問の意図はもちろん質問をした当人にしかわからないわけだが, そこを認識したうえであえていわせてもらうなら, #5 への補足に書いてある内容は #5 でなされた質問の答になっていない... というか, おそらく #5 はそんなことを想定していないと思う.
#5 では 2つのエラーメッセージを並べた上で「意味は同じ」「でも違うところもある」と言っているわけだから, 「2つのメッセージでどこが違うのかを理解しろ」ということだと思うんだけど.... 的を外しているなら突っ込み歓迎>kmeeさん.
この回答への補足
ご回答、ありがとうございます。
すみません、本件についてまだまだ分かっていません。
#5について、再度考えますと、
前回の問題も、今回の問題も、
g77やifortからc言語で作った関数が参照できないから
リンクエラーを出している、と認識しています。
前回の場合は、古いg77から新しいg77を使用することで
リンクできました。
このとき、古いg77の持っているライブラリ群に
c++のライブラリがなかったのが原因だったと思います。
つまり、新しいg77には、c++のライブラリがあったから
リンクできた、と認識しています。
(この認識が間違っていたら、指摘してください。)
そして、前回の問題を踏まえると、今回のifortも
c++ライブラリがないから、「_FUNCHELLOCが参照できない」
と言われているのではないかと思っています。
そうすると、
・ifortのデフォルトで参照するライブラリ群のあるフォルダはどこか、
・ifortはデフォルトでどんなライブラリをもっているか、
・持っていないライブラリをifortが認識させるにはどうすればよいか、
ということが調べれば宜しい出のでしょうか。
本当に分かっていないので、いろいろと突っ込んでください。
お願いします。
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: 参照
ということで、言い回しこそ違いますが、同じエラーです。
では、(コンパイラの種類以外の)違いはなんでしょうか?
この回答への補足
ご回答、ありがとうございます。
コンパイラ以外に違う点は、
リンカとしてifortを使っている
点でしょうか?
すみません、分かっていません。
No.4
- 回答日時:
未解決シンボルの 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ヶ月も経っていないレベルなので、四苦八苦しています。)
結果から申し上げますと、リンクできませんでした。
>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でお答えした内容が出力されます。
本当に、はまっています。
No.3
- 回答日時:
なんで「メモを取れない」んだろうかというか, なんで「メモを取らないといけない」んだろう. よほど劣悪な環境でもなければ, 「メモを取る」必要性がないと思うんだけどなぁ. だって, 「コンパイラの出力を記録する」だけでしょ?
前も書いたような気がするんだけど「失敗に終わっています」なんて書かれても役に立たない. 何らかのエラーメッセージが出ているなら, それをきちんと書いてください. 「linkというコマンドも試してみました」だって, 「どのように実行したのか」もなければ「どのような結果になったのか」もないので, 判断のしようがありません.
あと, IntelFortran のコマンドラインオプションは知らないけど,
ifort helloFortran.obj funcHelloC.o -lstdc++
というのはどこに書いてあったんでしょうか?
No.2
- 回答日時:
これまでのように、ファイルを分割した場合、全部の関数とか変数とかがオブジェクトファイルに存在しない、ということにないます。
例: 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が未解決です。
ご指摘頂いたように、いろんなコンパイラを使用しているので
少々混乱しています。
しかしながら、いろんなコンパイラで実行するとどうなるか
試してみたく、今回質問させて頂きました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
- IT・エンジニアリング FORTRAN、COBOL、C、Java、C++とか誰が作ったのですか?言語習い使いまた出て、キリが 4 2023/05/06 23:11
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- 経済学 「政府支出乗算」の求め方を教えてください。 2 2022/11/20 19:52
- 数学 g=gcd(a,b)とする。このときa|cかつb|cならばab|cgを示せ。という問題を c=qa, 3 2023/05/21 18:31
- Visual Basic(VBA) 複数の列の値を結合して別の列へ返す 2 2022/08/06 16:07
- 数学 複素関数にロピタルの定理を使おうとしている回答者は、複素関数論はおろか微積分学もよく分かっていない、 5 2022/12/28 18:02
- 高校 合成関数の定義域につきまして 1 2022/05/18 17:26
- Excel(エクセル) エクセルデーターの並び替え 5 2022/08/06 09:59
- 数学 代数学 環 1 2022/10/12 17:29
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
error LNK2001について
-
PathIsDirectoryを使って
-
C言語のエラー LNK1120: 外部参照
-
IP Helper APIを使うとエラーが...
-
wsprintfのエラーについて
-
python エラー
-
<unistd.h>をVisualStudioでつ...
-
エクセルのエラーメッセージ「4...
-
” OS ビルド ” の意味が分か...
-
適切な変換関数が存在しない???
-
アプリケーションのDLLファイル...
-
Makefile作成時の拡張子.oとは?
-
c言語です コンパイルした時に...
-
<math.h>があるのにsqrtが・...
-
C言語でヘッダファイルにグロー...
-
Excelのエラーで困ってます。
-
デバッグ中のエラーのことで教...
-
ソフトの開発言語を調べる方法
-
1 つ以上の複数回定義されてい...
-
eclipseでプログラムが実行でき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
外部依存関係について
-
error LNK2001について
-
外部シンボル" ~~"は未解決で...
-
LNK2019: 外部シンボル どのよ...
-
C言語のエラー LNK1120: 外部参照
-
LNK2001(Pro*c)
-
popen・pcloseについて
-
外部シンボルについて
-
LNK2019: 未解決の外部シンボル...
-
このプログラムを動かしたいの...
-
VC++ 6.0へのサンプルプログラ...
-
外部シンボルの未解決のエラー
-
パブリックシンボルとは?
-
wsprintfのエラーについて
-
VC++2008でのサンプルプログ...
-
実行ファイルの容量を減らした...
-
エラーが外れません!深刻な問...
-
ilink32について。'__setargv__...
-
エラー 未解決の外部シンボル
-
リンカのエラー
おすすめ情報