C++ 库编程错误 : ld: symbol(s) not found for architecture x86_64

标签 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$ 

最佳答案

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

实际上,这意味着您:

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

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

关于C++ 库编程错误 : ld: symbol(s) not found for architecture x86_64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11166153/

相关文章:

c++ - 缩小转换范围

c++ - 使用 conio.h 更改文本颜色时出错

c++ - 调整 Makefile 以包含 SDL2

c++ - `pragma pack(push, 1)` 在 GCC 4.4.7 中崩溃。可能的编译器错误?

c++ - Error C2084 函数已有主体

C 语法 : Is the following 'extern volatile const' behavior consistent among C compilers?

c++ - 模板函数和 const 限定符中的类型推导

c - GCC 优化器在 nostdlib 代码中生成错误

linux - 如何禁用 SVC ARM 指令(gcc、uclibc、buildroot)?

c++ - 如何将编译扩展到函数或循环