libgphoto2 gp_log_add_funcが見つからない

libgphoto2のgp_log_add_func関連をC++用ラッピングクラスを作成した時にエラーが出たため、その解消方法を記載

gPhoto - Projects :: libgphoto2

現在使用しているバージョンは2.5.26。

問題点

C++ファイル中からgp_log_add_funcを呼び出した場合、以下のようなエラーメッセージが出た。

Logger.o : error : 関数 `gphoto2::Logger::Logger(gphoto2::LoggingLevel)' 内:
Logger.cpp(34): error : `gp_log_add_func(GPLogLevel, void (*)(GPLogLevel, char const*, char const*, void*), void*)' に対する定義されていない参照です

コンパイルエラーではなくリンク時のエラー。

これら関数群が定義されているヘッダーファイルgphoto2/gphoto2-port-log.hを見たところ、extern “C”の宣言でくくられていなかった。

通常というかほかのCのヘッダーファイルには、C++ソースからCの関数群を呼び出せるように、以下のような定義がされているのが一般的。


#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
ここに宣言
#ifdef __cplusplus
}
#endif /* __cplusplus */

実際、gphoto2/gphoto2-port-log.h以外の使用しているヘッダーにはその定義がされていた。

extern “C”がなかったため呼び出し側はC++関数として認識され、リンカー側でC++関数の参照解消をされたようだ。

対応方法

インクルードファイルを呼び出すC++ソース側で、以下のような記述を行うことで暫定的に対応した。

extern "C" {
#include <gphoto2/gphoto2-port-log.h>
}

 

コメント

タイトルとURLをコピーしました