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

Posted

技术标签:

【中文标题】C++ 库编程错误:ld:未找到架构 x86_64 的符号【英文标题】:C++ Library programming error: ld: symbol(s) not found for architecture x86_64 【发布时间】:2012-06-23 01:48:19 【问题描述】:

我开始编写库代码,并决定进行测试,但我在问题标题中收到错误(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$ 

【问题讨论】:

Why do I get "unresolved external symbol" errors when using templates? 的可能重复项 【参考方案1】:

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

实际上,这意味着您可以:

    将 tlib.cpp 中的内容放入 tlib.h。这是最常见的解决方案。

    限制自己只使用(比如)dobra&lt;double&gt;,并将显式实例化放入 tlib.cpp:

    template double dobra&lt;double&gt;(const double&amp; valor);

【讨论】:

OP 正在使用一个相当新的 gcc - 我似乎记得所以编译器开关有助于模板 - 现在试图找到它们 @AdrianCornish:年纪大点可能会更好。 GCC 曾一度支持 errm、cfront 模型?您可以在一个源文件中声明模板并在另一个源文件中定义它们,编译器和链接器将一起工作并让事情正常工作。它要么从未流行,要么从未真正运作良好。我认为这样做是 C++98 标准中的一个可选功能。它从未被广泛实现,因此根本无法移植,并且几乎在 C++11 中死掉了。 如果您真的想走这条路,gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html 可能是一个不错的起点。 同意模板处理在大多数编译器中都很糟糕——但我想到了这个选项我相信“-frepo 在链接时启用自动模板实例化。这个选项也意味着 -fno-implicit-templates。”不确定是否会帮助 OP,因为您回答 1 是我认为的最佳方式

以上是关于C++ 库编程错误:ld:未找到架构 x86_64 的符号的主要内容,如果未能解决你的问题,请参考以下文章

C ++ XCODE ld:未找到架构x86_64 clang的符号:错误:链接器命令失败,退出代码为1(使用-v查看调用)

错误:未找到架构 x86_64 的符号,collect2:ld 返回 1 退出状态

ld:未找到架构 x86_64(领域)的符号

ld:未找到框架架构 x86_64 的条纹

ld:入口点(_main)未定义。对于架构 x86_64:Xcode 9

未找到体系结构 x86_64 的符号