共有オブジェクトにコンパイルされるクラスがある場合。クラスは .h ファイルで宣言され、.cpp ファイルで実装されます。
このクラスには、いくつかのインライン メソッドが含まれています。
この共有ライブラリにリンクし、.h ファイルをインクルードするプログラムを作成すると、リンク時に未定義の参照エラーが発生します。
インライン メソッド用にエクスポートされたシンボルがないためでしょうか。
これを正しく理解していますか?
更新:以下のコード例
somelib.h
#ifndef __ABC_LIB_H
#define __ABC_LIB_H
#include <iostream>
class ABC {
ABC();
~ABC();
inline void not_callable_outside_library();
void callable_outside_library();
};
#endif
somelib.cpp
#include "somelib.h"
ABC::ABC() {}
ABC::~ABC() {}
void ABC::not_callable_outside_library(){ std::cout<<"not_callable_outside_library"<<std::endl; }
void ABC::callable_outside_library(){ std::cout<<"callable_outside_library"<<std::endl; }
プログラム.cpp
#include "somelib.h"
int main() {
ABC x;
x.not_callable_outside_library();
return 0;
};
somelib.cpp を共有ライブラリ ( .so オブジェクト) としてコンパイルし、それを program.cpp にリンクすると、programというバイナリが得られます。
これで、リンク時に未定義の参照が取得されるはずです。