C++ C++;库编程错误:未找到体系结构x86_64的ld:symbol

C++ C++;库编程错误:未找到体系结构x86_64的ld:symbol,c++,gcc,compiler-construction,compilation,C++,Gcc,Compiler Construction,Compilation,我开始编写一个库,并决定做一个测试,但问题标题中出现了错误(Mac OSX,gcc-4.7.1): tlib.cpp: template <typename T> T dobra(const T& valor){ return valor*2; } 模板 T多布拉(康斯特·T&valor){ 返回英勇*2; } tlib.h: template <typename T> T dobra(const T& valor); 模板 T多布拉(康斯特·T

我开始编写一个库,并决定做一个测试,但问题标题中出现了错误(Mac OSX,gcc-4.7.1):

tlib.cpp:

template <typename T>
T dobra(const T& valor){
  return valor*2;
}
模板
T多布拉(康斯特·T&valor){
返回英勇*2;
}
tlib.h:

template <typename T>
T dobra(const T& valor);
模板
T多布拉(康斯特·T&valor);
test2.cpp:

#include "tlib.h"
#include <iostream>

using namespace std;

int main (int argc, char const *argv[])
{ 
  double b = dobra<double>(10);
  cout << b << endl;
  return 0;
}
#包括“tlib.h”
#包括
使用名称空间std;
int main(int argc,char const*argv[]
{ 
双b=多布拉(10);

Cuth

C++中的一个事实是,必须在每个编译单元中包含一个模板的完整实现,或者将自己限制在特定的实例中。 实际上,这意味着您可以:

  • 将tlib.cpp中的内容放入tlib.h中。这是最常见的解决方案
  • 限制自己只使用(比如)
    dobra
    ,并在tlib.cpp中添加一个显式实例化:

    template double-dobra(const-double&valor);


  • OP的可能副本是使用一个非常新的gcc——我似乎记得有助于模板的编译器开关——试图找到它们now@AdrianCornish:旧的可能更好。GCC在某一点上支持,errm,cfront模型?在该模型中,您可以在一个源文件中声明模板并在另一个源文件中定义它们,编译器和链接器可以一起工作,只是让事情顺利进行。它要么从未流行,要么从未真正工作良好。我认为这样做是C++98标准中的一个可选功能。它从未被广泛实现,因此根本不可移植,并且对C++11来说几乎是致命的。如果你真的想继续下去,这可能是一个好的开始d、 Agree模板处理在大多数编译器中都很糟糕-但我认为我想到了这个选项”-frepo在链接时启用自动模板实例化。这个选项还意味着-fno隐式模板。“不确定当您回答1时是否有助于OP,我认为这是最好的方法
    no25-89:CPROP canesin$ g++ -dynamiclib -Wall -std=c++11 tlib.cpp -o libdobra.so
    no25-89:CPROP canesin$ g++ test2.cpp -Wall -std=c++11 -o test2 -L. -ldobra
    Undefined symbols for architecture x86_64:
      "double dobra<double>(double const&)", referenced from:
          _main in cctLJGqf.o
    ld: symbol(s) not found for architecture x86_64
    collect2: error: ld returned 1 exit status
    no25-89:CPROP canesin$