架构 x86_64 的未定义符号:C++ OS X 向量

Posted

技术标签:

【中文标题】架构 x86_64 的未定义符号:C++ OS X 向量【英文标题】:Undefined symbols for architecture x86_64: C++ OS X vectors 【发布时间】:2015-01-27 21:40:41 【问题描述】:

当我使用以下语法传递向量的地址时:

void myfunction(std::vector<double>*);
int main()

    std::vector<double> t;
    myfunction(&t);
    return 0;

void myfunction(std::vector<double> &v)

    cout << "The function ran" <<endl;

我收到此错误,但不知道为什么。

pal-nat184-134-146:p25 pdevieti$ g++-4.9 test.cpp 
Undefined symbols for architecture x86_64:
  "myfunction(std::vector<double, std::allocator<double> >*)", referenced from:
      _main in ccVmpacj.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

【问题讨论】:

您的myfunction 声明与定义不符。 myfunction 的声明中,参数是一个指向双精度向量的指针,在定义中,您引用了相同类型的向量 您重新安装了操作系统和编译器,因为您遇到了链接器错误??! 您的代码正在调用一个不存在的函数。编译器不知道该函数实际上并不存在。该工作留给链接器,链接器在任何地方都找不到将指针指向向量的函数。所以你无缘无故做了所有这些卸载/重新安装游戏。 【参考方案1】:

改变这个:

void myfunction(std::vector<double>*);

到这里:

void myfunction(std::vector<double>&);

错误是“myfunction”的声明和定义中的签名不同。您将myfunction 声明为接收指向向量的指针的函数,但将其定义为接收引用的函数。从语言的角度来看,引用和指针是不同的东西。

请参阅this thread 以获得一些非常详细的解释。

【讨论】:

我会选择另一种方式,那就是使用引用 视情况而定。在相应对象可能不存在的情况下,引用没有意义。在这种情况下,使用指针并使用nullptr 表示缺席是有意义的。所以 OP 应该判断哪个最适合他们的用例。 太棒了,谢谢,解决了。如果我只是传递一个数组来存储双精度值,是通过引用还是指针更好? C++ 中惯用的方法是使用引用,直到不能使用为止。在这种情况下,没有迹象表明该参数是可选的。使用引用应该是这里的建议,带有一个不关于的站点和选择使用指针作为可选参数的链接。 太棒了。我将它们切换到原始程序中的引用,现在我开始遇到新错误。感谢您的帮助。

以上是关于架构 x86_64 的未定义符号:C++ OS X 向量的主要内容,如果未能解决你的问题,请参考以下文章

C++ FFT 实现(架构 x86_64 的未定义符号)

MAC OS X 10.8 上的 gcc 4.8 抛出“架构 x86_64 的未定义符号:”

C++ 错误:架构 x86_64 的未定义符号

编译时错误“架构 x86_64 的未定义符号”是啥意思?

QT-creator 中架构 x86_64 的未定义符号

gcc:架构 x86_64 的未定义符号,缺少 vtable