具有模板功能的库链接错误

时间:2013-10-28 21:41:08

标签: c++ templates linker

阅读以下undefined reference to template function我解决了我的问题,但我的模板函数实际上是在库中调用的,所以它正在实现我会认为这应该在共享对象中定义它的类型,但是我不断收到链接器错误。考虑...

我有以下定义的文件(common.h,common.cpp,myclass.h和myclass.cpp):

COMMON.H

namespace myn
{
    template<class T> T map(T val1, T val2);
};

common.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>模板。

0 个答案:

没有答案