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

初めて質問させて頂きます。
質問は2つあります。

●1つ目の質問です。
この度、C言語ベースのプログラムに、C++で作成した関数を使用することになりました。
方法としてextern等を駆使しつつ、ラッパー関数を使って対応しております。
そこで質問なのですが、この場合、ラッパー関数に使用するファイル形式はcppまたはcのどちらが正しいのでしょうか?(どちらでも動きました)


●2つ目の質問です。
Windows環境(vs2005)では無事、CからC++の関数を呼ぶことに成功はしました。

しかし、本当に動かしたいのはLinuxでの環境になります。
先程作成したラッパー関数のファイルとC++で作成した関数のファイルをライブラリ(soファイル)化したものを使用し、コンパイルとリンクは問題なく通すことに成功したのですが、
実行させてみると、Cの関数からラッパー関数をコールしているのは確実なのですが、ラッパー関数の処理を通らず、プログラムが止まってしまいます。
試しにラッパー関数の処理を「return 0;」だけにして実行させてみましたが現象は変わらずでした。
そのため、ラッパー関数を呼ぶための何かに問題があると思っています。

ここで質問なのですが、ビルドのときにライブラリをリンクさせるだけでは駄目なのでしょうか。また、他に思い当たることがありましたらご教示頂きたいです。
Windows環境(vs2005)では期待する動作をしているためプログラムは問題ないと思っています。

A 回答 (2件)

「ラッパー関数」は共有ライブラリ (DLL) 内に配置していると解釈して思い当たる事を。



> ●1つ目の質問です。

DLL を C からも使いたい場合に、DLL から公開 (export) する関数を、C++ で書くべきか C で書くべきかという事でしたら、どちらでも構いません。(もちろん、C++ で公開する関数を書く時は extern "C" を付ける必要はありますが、それだけです。)

> ●2つ目の質問です。
> ここで質問なのですが、ビルドのときにライブラリをリンクさせるだけでは駄目なのでしょうか。また、他に思い当たることがありましたらご教示頂きたいです。

DLL (.so) はどこに配置しているのでしょうか。Windows と Linux では DLL の検索パスが異なります。
Windows → http://msdn.microsoft.com/ja-jp/library/7d83bc18 … (MSDN)
Linux → http://en.wikipedia.org/wiki/Rpath (英語Wikipedia)

Windows は実行ファイルと同じディレクトリに DLL があるかどうか確認しますが、Linux では (恐らくセキュリティを考慮に入れて) 既定では、実行ファイルと同じディレクトリにある DLL を確認しません。

処理系 (OS, コンパイラ) に依存するかも知れませんが例えば:

(a) リンク時 (~コンパイル時) に RPATH に実行ファイルと同じディレクトリを追加する (オプション -Wl,-R,'$ORIGIN') か
$ gcc -o 実行ファイル fuga -L何とか -lかんとか -Wl,-R,'$ORIGINI'
($ORIGIN は「実行ファイルと同じディレクトリ」という意味の特別な指定だそうです。参考 URL 参照下さい)

(b) または、実行時に LD_LIBRARY_PATH 環境変数に DLL の配置場所を指定するか
$ export LD_LIBRARY_PATH='DLL のあるディレクトリ'
$ ./実行ファイル ...

すれば良いです。

# しかし、DLL が見付からなければプログラムの起動時点で失敗するはずなのですが、
# > 実行させてみると、Cの関数からラッパー関数をコールしているのは確実
# は不思議ですね…もしかして DLL を遅延ロード (dynamic loading) とかしていますか?

参考URL:http://itee.uq.edu.au/~daniel/using_origin/
    • good
    • 1
この回答へのお礼

>DLL を C からも使いたい場合に、DLL から公開 (export) する関数を、C++ で書くべきか C で書>くべきかという事でしたら、どちらでも構いません。(もちろん、C++ で公開する関数を書く時は extern "C" を付ける必要はありますが、それだけです。)

回答ありがとうございます。
決まりがあるのかと思ったのですが無いのですね。

>DLL (.so) はどこに配置しているのでしょうか。Windows と Linux では DLL の検索パスが異なります。

まさしくこれが原因でした。
配置場所を変更するだけで無事動作しました!!


># は不思議ですね…もしかして DLL を遅延ロード (dynamic loading) とかしていますか?
ちなみに遅延ロードは行ってないです。本当に不思議です。。。

お礼日時:2013/11/08 00:57

具体的にはどのような方法で行ってるのでしょうか。


それがわからないと回答のしようがないです。

通常はCから呼び出したい関数をextern "C"を使って宣言すればいいだけなはずですけど、それに加えてラッパー関数といわれてますので何をやってるのかわかりませんし。

>Windows環境(vs2005)では期待する動作をしているためプログラムは問題ないと思っています。

Windows環境でだけ通用する手段ということもありえますので、必ずしもそうはいえません。
    • good
    • 0
この回答へのお礼

申し訳ございません。
次回からはもう少し詳細に書きたいと思います。

>Windows環境でだけ通用する手段ということもありえますので、必ずしもそうはいえません。
Windowsで動いたからと安心してはいけませんね。。すみません。。。

お礼日時:2013/11/08 00:53

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