我开始编写库代码,并决定进行测试,但是出现问题标题(Mac OSX,gcc-4.7.1)错误:

tlib.cpp:

template <typename T>
T dobra(const T& valor){
  return valor*2;
}


tlib.h:

template <typename T>
T dobra(const 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;
}


编译:

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$

最佳答案

C ++的一个现实事实是,您必须在所使用的每个编译单元中都包含模板的完整实现,或者将自己限制为特定的实例。

实际上,这意味着您要么:


将您在tlib.cpp中拥有的内容放入tlib.h中。这是最常见的解决方案。
将自己限制为仅使用(例如)dobra<double>,并将显式实例化放入tlib.cpp中:

template double dobra<double>(const double& valor);

关于c++ - C++库编程错误:ld:找不到体系结构x86_64的符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11166153/

10-10 05:21