![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
C++の関数をfortranから呼びたい。(g++, g77)
いつもお世話になっています。
現在WindowsXPにMinGWというソフトを入れて
C++のコンパイルはg++を
Fortranのコンパイルはg77を
使用しています。
(いずれも動作は確認できています。)
現在、以下のようなソースを使用して
fortranからC++関数を呼ぼうとしていますが
できておりません。
ソース内容、コンパイル方法に問題があれば
ご指摘頂きたくお願いします。
■C++ソース
#include <stdio.h>
#include <iostream>
extern "C" void funcHelloC_();
void funcHelloC_(void)
{
printf("hello C world!\n");
}
■fortranソース
write(*,*) "Hello Fortran World."
call funcHelloC()
end
※実際のソースの各文先頭には、半角スペース6つ分が
記述しています。
■コンパイル手順
D:\C>g++ -c funcHelloC.cpp
D:\C>g77 -c helloFortran.f
D:\C>g77 helloFortran.o funcHelloC.o
helloFortran.o(.text+0x51):helloFortran.f: undefined reference to `funchelloc_'
funcHelloC.o(.text+0xd):funcHelloC.cpp: undefined reference to `_ZNKSs4sizeEv'
funcHelloC.o(.text+0x60):funcHelloC.cpp: undefined reference to `_ZNKSsixEj'
funcHelloC.o(.text+0x9e):funcHelloC.cpp: undefined reference to `_ZNKSsixEj'
funcHelloC.o(.text+0xcc):funcHelloC.cpp: undefined reference to `_ZNKSsixEj'
funcHelloC.o(.text+0x12f):funcHelloC.cpp: undefined reference to `_ZNSt8ios_base4InitC1Ev'
funcHelloC.o(.text+0x14a):funcHelloC.cpp: undefined reference to `_ZNSt8ios_base4InitD1Ev'
No.4ベストアンサー
- 回答日時:
結論的には「古い g77 がライブラリを探すディレクトリに C++ のライブラリがなかった」ってことですね.
困ったらとりあえず man を見る.
それでわからなかったら本家を探す.
参考URL:http://gcc.gnu.org/
ご回答、有難うございます。
ちなみに、#3で質問頂いたg++のバージョンは
以下のとおりでした。
D:\C>g++ -v
Reading specs from C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/specs
Configured with: ../gcc-3.4.5-20060117-3/configure --with-gcc --with-gnu-ld --wi
--host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls -
nguages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --enab
ceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm -
ibgcj-debug --enable-interpreter --enable-hash-synchronization --enable-libstdcx
Thread model: win32
gcc version 3.4.5 (mingw-vista special r3)
また、機会があればよろしくお願いします。
No.3
- 回答日時:
ld の -L オプションでライブラリ検索ディレクトリが指定できるので,
D:\G77\bin\..\lib\gcc-lib\i386-minw32\2.95\..\..\..
というディレクトリに -lstdc++ でリンクされるライブラリ (libstdc++.* って名前だったと思う) が見付からない (もちろん他の検索ディレクトリも含めて) ってことかなぁ?
でも, 正直な話 2.95 は「ちょー古い」バージョンなので, どうしてもこれでなければならない事情がなければ新しいコンパイラにした方がいいような気もする.
ちなみに g++ のバージョンはどうなってますか?
この回答への補足
ご回答、有難うございます。
>でも, 正直な話 2.95 は「ちょー古い」バージョンなので,
という指摘を頂いて、気づきました。
以前以下のサイトからg77単独を設定していました。
http://www1.doshisha.ac.jp/~jmizushi/g77.html
そして、MinGWのPATHよりも、古いg77である
D:\G77\binのPATHを先に通していたので、
コマンドから
>g77
としても、おそらくその古いg77を使用していて
MinGWのg77を使用していなかったと思われます。
PATHから古いg77のPATHを消したところ、exeファイルができました!
以下が実行結果です。
D:\C>g77 -v helloFortran.o funcHelloC.o -lstdc++
Driving: g77 -v helloFortran.o funcHelloC.o -lstdc++ -lfrtbegin -lg2c
Reading specs from C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/specs
Configured with: ../gcc-3.4.5-20060117-3/configure --with-gcc --with-gnu-ld --with-gnu-as --host=ming
w32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++,f77,ada,
objc,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disabl
e-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-ha
sh-synchronization --enable-libstdcxx-debug
Thread model: win32
gcc version 3.4.5 (mingw-vista special r3)
C:/MinGW/bin/../libexec/gcc/mingw32/3.4.5/collect2.exe -Bdynamic C:/MinGW/bin/../lib/gcc/mingw32/3.4
.5/../../../crt2.o C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/crtbegin.o -LC:/MinGW/bin/../lib/gcc/mingw32
/3.4.5 -LC:/MinGW/bin/../lib/gcc -LC:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../mingw32/lib -LC:
/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../.. helloFortran.o funcHelloC.o -lstdc++ -lfrtbegin -lg2c -l
mingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32 -ladvapi32 -lshell32 -lmingw32 -lgcc
-lmoldname -lmingwex -lmsvcrt C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/crtend.o
D:\C>a.exe
Hello Fortran World.
hello C world!
ちなみに、コマンドの最後に付け足した「-lstdc++」や教えて頂いた
-Lのオプションのことが十分に理解できていません。
(今回の場合、古いg77フォルダのなかにC++ライブラリがなかった
ということですか。)
参考になるサイトをご存知であれば教えて頂きたくお願いします。
No.2
- 回答日時:
おかしいなぁ, -l が認識されてない?
g77 -v helloFortran.o funcHelloC.o -lstdc++
と入力したら, どのような表示が得られますか?
この回答への補足
ご回答、有難うございます。
こんな感じの出力結果になりました。
D:\C>g77 -v helloFortran.o funcHelloC.o -lstdc++
g77 version 2.95 19990728 (release) (from FSF-g77 version 0.5.25 19990728 (release))
Driving: g77 -v helloFortran.o funcHelloC.o -lstdc++ -lg2c
Using builtin specs.
gcc version 2.95 19990728 (release)
ld D:\G77\bin\..\lib\gcc-lib\i386-mingw32\2.95\..\..\..\crt1.o -LD:\G77\bin\..\lib\gcc-lib\i386-min
w32\2.95\..\..\.. helloFortran.o funcHelloC.o -lstdc++ -lg2c -lmingw32 -lgcc -lmoldname -lcrtdll -lu
er32 -lkernel32 -ladvapi32 -lshell32 -lmingw32 -lgcc -lmoldname -lcrtdll
ld: cannot open -lstdc++: No such file or directory
No.1
- 回答日時:
fortranはほんのちょっとしかやったことないのですが。
> helloFortran.o(.text+0x51):helloFortran.f: undefined reference to `funchelloc_'
funchelloc_ と小文字になってます。
funcHelloC.oの中のラベルはfuncHelloC_と大文字になっているはずです。
Fortranでの大文字小文字の区別は基本的に無いようなので、区別するような設定するか、C++の関数名を小文字だけにするといいようです。
> funcHelloC.o(.text+0xd):funcHelloC.cpp: undefined reference to `_ZNKSs4sizeEv'
(以下略)
C++標準ライブラリがリンクされていないからではないかと。
g77 helloFortran.o funcHelloC.o -lstdc++
としたらこの部分は消えませんか?
当方、g++4.2,gfortran4.2で、その小文字に変更、-lstdc++追加でコンパイル、実行を確認しました。
この回答への補足
ご回答、ありがとうございます。
C++のファイルの関数名を全部小文字にしました。
そして、g77 helloFortran.o funcHelloC.o -lstdc++
を実行しましたが、駄目のようです。
リンクができていないということでしょうか?
これが実行結果です。
D:\C>g++ -c funcHelloC.cpp
D:\C>g77 -c helloFortran.f
D:\C>g77 helloFortran.o funcHelloC.o -lstdc++
ld: cannot open -lstdc++: No such file or directory
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
- その他(プログラミング・Web制作) python fbprophetについて 1 2022/09/29 19:44
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- 英語 共通の前置詞の目的語を持つ前置詞句を列挙する際の表現方法について(省略の位置と方法) 3 2023/08/24 09:40
- 英語 英文の添削をお願いします 4 2023/05/23 11:10
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- Mac OS BOOK Air HDMI入力を表示するソフト 1 2023/01/21 18:06
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
クリティカルエラー Expressio...
-
相互に参照する構造体について
-
Fortranについて教えてください
-
GDL(GCC DEVELOPER LITE)の...
-
PRO*C コンパイルエラー
-
DllEntryPointが呼び出されてい...
-
1 つ以上の複数回定義されてい...
-
” OS ビルド ” の意味が分か...
-
ソースコードの隠蔽
-
VB5の逆コンパイルについて
-
<math.h>があるのにsqrtが・...
-
外部シンボル "_main"は未解決です
-
C++プログラムにおけるexeファ...
-
DirectX9SDKが入ってるPCでDi...
-
ExcelVBAで『ByRef 引数の型が...
-
ヘッダファイルに関数本体を書...
-
共有ライブラリの関数はヘッダ...
-
定数式とはどういう意味でしょ...
-
C++コンパイル時に『 C1083: in...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
<math.h>があるのにsqrtが・...
-
” OS ビルド ” の意味が分か...
-
1 つ以上の複数回定義されてい...
-
「fatal error C1189」を回避す...
-
ILSpyで、デコンパイルできない。
-
Makefile作成時の拡張子.oとは?
-
エクセルVBAではRound...
-
C言語でヘッダファイルにグロー...
-
外部シンボル "_main"は未解決です
-
セミコロンについて
-
マクロ コンパイルがグレーバック
-
戻り値について
-
C言語でmからnまでの合計を求め...
-
C++コンパイル時に『 C1083: in...
-
コンパイルエラー:ユーザ定義...
-
クリティカルエラー Expressio...
-
PRO*C コンパイルエラー
-
【VC++6.0(MFC)】警告「LINK : ...
-
[c++] <pthread.h>がinclude で...
おすすめ情報