1

共有オブジェクトにコンパイルされるクラスがある場合。クラスは .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というバイナリが得られます。

これで、リンク時に未定義の参照が取得されるはずです。

4

1 に答える 1

6

インライン関数は、ヘッダー ファイルで定義する必要があります。あなたが持っているものを次のものと対比してください:

somelib.h:

#ifndef ABC_LIB_H
#define ABC_LIB_H

#include <iostream>
class ABC {
    ABC();
    ~ABC();
    void not_callable_outside_library();
    void callable_outside_library();
};

inline void ABC::not_callable_outside_library() {
    std::cout << "not_callable_outside_library\n";
}

#endif

somelib.cpp:

#include "somelib.h"

ABC::ABC() { }
ABC::~ABC() { }
void ABC::callable_outside_library() {
    std::cout << "callable_outside_library\n";
}

プログラム.cpp:

#include "somelib.h"

int main() {
    ABC x;
    x.not_callable_outside_library();
}
于 2012-08-06T04:55:52.270 に答える