
初めて質問させて頂きます。
質問は2つあります。
●1つ目の質問です。
この度、C言語ベースのプログラムに、C++で作成した関数を使用することになりました。
方法としてextern等を駆使しつつ、ラッパー関数を使って対応しております。
そこで質問なのですが、この場合、ラッパー関数に使用するファイル形式はcppまたはcのどちらが正しいのでしょうか?(どちらでも動きました)
●2つ目の質問です。
Windows環境(vs2005)では無事、CからC++の関数を呼ぶことに成功はしました。
しかし、本当に動かしたいのはLinuxでの環境になります。
先程作成したラッパー関数のファイルとC++で作成した関数のファイルをライブラリ(soファイル)化したものを使用し、コンパイルとリンクは問題なく通すことに成功したのですが、
実行させてみると、Cの関数からラッパー関数をコールしているのは確実なのですが、ラッパー関数の処理を通らず、プログラムが止まってしまいます。
試しにラッパー関数の処理を「return 0;」だけにして実行させてみましたが現象は変わらずでした。
そのため、ラッパー関数を呼ぶための何かに問題があると思っています。
ここで質問なのですが、ビルドのときにライブラリをリンクさせるだけでは駄目なのでしょうか。また、他に思い当たることがありましたらご教示頂きたいです。
Windows環境(vs2005)では期待する動作をしているためプログラムは問題ないと思っています。
No.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/
>DLL を C からも使いたい場合に、DLL から公開 (export) する関数を、C++ で書くべきか C で書>くべきかという事でしたら、どちらでも構いません。(もちろん、C++ で公開する関数を書く時は extern "C" を付ける必要はありますが、それだけです。)
回答ありがとうございます。
決まりがあるのかと思ったのですが無いのですね。
>DLL (.so) はどこに配置しているのでしょうか。Windows と Linux では DLL の検索パスが異なります。
まさしくこれが原因でした。
配置場所を変更するだけで無事動作しました!!
># は不思議ですね…もしかして DLL を遅延ロード (dynamic loading) とかしていますか?
ちなみに遅延ロードは行ってないです。本当に不思議です。。。
No.1
- 回答日時:
具体的にはどのような方法で行ってるのでしょうか。
それがわからないと回答のしようがないです。
通常はCから呼び出したい関数をextern "C"を使って宣言すればいいだけなはずですけど、それに加えてラッパー関数といわれてますので何をやってるのかわかりませんし。
>Windows環境(vs2005)では期待する動作をしているためプログラムは問題ないと思っています。
Windows環境でだけ通用する手段ということもありえますので、必ずしもそうはいえません。
申し訳ございません。
次回からはもう少し詳細に書きたいと思います。
>Windows環境でだけ通用する手段ということもありえますので、必ずしもそうはいえません。
Windowsで動いたからと安心してはいけませんね。。すみません。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- C言語・C++・C# プログラム内から、MIDIファイルの一部分だけを再生する方法 1 2023/02/15 11:08
- Excel(エクセル) Excelで行削除をすると… 1 2023/07/26 11:57
- Mac OS 【USB-Cの充電】2本差しすると高速充電になる?故障の原因になる? 2 2022/08/08 09:38
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- その他(OS) Windowsで大量の画像サイズを半自動で変更する方法 6 2023/02/17 08:45
- その他(クラウドサービス・オンラインストレージ) Windowsクラウドサービス「OneDrive」の不具合 3 2022/06/17 20:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どんなプログラムを書いても指...
-
FTPでputすると空ファイルが出...
-
フルパスから最後のディレクト...
-
セルに入力されたパスでフォル...
-
「UNCパスはサポートされません...
-
絶対パスの絶対て英語で何でし...
-
ExcelVBAでカレントディレクト...
-
fopenで別ディレクトリにファイ...
-
ネットワーク上のコンピュータ...
-
SSI #include virtual="~"
-
VBでフォルダ単位のFTP
-
ThisWorkbook.Pathについて
-
FTPでリモートのファイル一覧取得
-
ファイルやディレクトリの存在...
-
インクルードファイルの設定に...
-
エクセルVBAで相対パスでファイ...
-
ファイルダイアログのカレント...
-
新規作成ファイルパスが有効か...
-
webアプリケーションでの画像フ...
-
Excelのマクロでファイル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フルパスから最後のディレクト...
-
どんなプログラムを書いても指...
-
FTPでputすると空ファイルが出...
-
「UNCパスはサポートされません...
-
絶対パスの絶対て英語で何でし...
-
ExcelVBAでカレントディレクト...
-
fopenで別ディレクトリにファイ...
-
windows.hがincludeされない
-
ファイルやディレクトリの存在...
-
セルに入力されたパスでフォル...
-
ネットワーク上のコンピュータ...
-
C言語を用いたファイルの一括削...
-
ExcelVBA サーバーの(共有フォ...
-
GetPrivateProfileStringでini...
-
マイクラでPythonのプログラミ...
-
webアプリケーションでの画像フ...
-
Ubuntu テキストファイルをどこ...
-
ファイルダイアログのカレント...
-
新規作成ファイルパスが有効か...
-
FindFirstFileについて
おすすめ情報