次のテンプレート関数への未定義の参照を読んで問題は解決しましたが、テンプレート関数は実際にはライブラリ内で呼び出されているため、実装されているため、共有オブジェクトでそのタイプを定義する必要があると考えていましたが、リンカーを取得し続けますエラー。検討...
以下に定義された次のファイル (common.h、common.cpp、myclass.h、および myclass.cpp) があります。
common.h
namespace myn
{
template<class T> T map(T val1, T val2);
};
共通.cpp
#include "common.h"
template<class T> T myn::map(T val1, T val2)
{
return val1+val2;
}
myclass.h
#include "common.h"
class myclass
{
private:
int val;
public:
myclass(int v1, int v2);
};
myclass.cpp
#include "myclass.h"
myclass::myclass(int v1, int v2)
{
this->val = myn::map<int>(v1, v2);
}
以下を使用してライブラリをコンパイルします。
g++ -Wall -fPIC -c common.cpp -o common.o
g++ -Wall -fPIC -c myclass.cpp -o myclass.o
g++ -shared -Wl,-soname,libmylib.so -o libmylib.so common.o myclass.o
与えられた場合main.cpp
:
#include "common.h"
#include "myclass.h"
int main(int argc, char ** argv)
{
myclass * x = 0;
if (argc == 1)
x = new myclass(20, 40);
else
x = new myclass(2343, 435);
delete x;
return 0;
}
私は以下を使用してコンパイルします:
g++ -Wall -L. main.cpp -o main.out -lmylib
次のエラーが表示されます。
./libmylib.so: undefined reference to `int myn::map<int>(int, int)'
collect2: error: ld returned 1 exit status
<int>
関数のバージョンをmap
定義するべきではありませんか? 次のようなことをしようとすると、定義されていないため文句を言う必要があることはわかってmyn::map<char>('a', 'b');
いますが、確かに私の場合<int>
はテンプレートが定義されています。