C ++库编程错误:找不到架构x86_64的ld:符号

时间:2012-06-23 01:48:19

标签: c++ gcc compiler-construction compilation

我开始编写一个库,并决定进行测试,但我在问题标题中得到错误(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);

测试2.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$ 

1 个答案:

答案 0 :(得分:2)

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

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

  1. 将您在tlib.cpp中获得的内容放入tlib.h.这是最常见的解决方案。
  2. 限制自己只使用(比方说)dobra<double>,并将明确的实例化放入tlib.cpp:

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