dポイントプレゼントキャンペーン実施中!

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'

A 回答 (4件)

結論的には「古い g77 がライブラリを探すディレクトリに C++ のライブラリがなかった」ってことですね.


困ったらとりあえず man を見る.
それでわからなかったら本家を探す.

参考URL:http://gcc.gnu.org/
    • good
    • 0
この回答へのお礼

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

ちなみに、#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)

また、機会があればよろしくお願いします。

お礼日時:2010/04/08 23:08

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++ライブラリがなかった
 ということですか。)
参考になるサイトをご存知であれば教えて頂きたくお願いします。

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

おかしいなぁ, -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

補足日時:2010/04/07 22:30
    • good
    • 0

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

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

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