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>
}
コメント