【问题标题】:Accessing static member function gives: ld: symbol(s) not found for architecture x86_64访问静态成员函数给出: ld: symbol(s) not found for architecture x86_64
【发布时间】:2020-11-23 01:03:35
【问题描述】:

我确信这是一个 C++ 菜鸟问题,只是反映了我的理解不足。

我有一个文件

A.cxx 包含,

#include "Rishab.h"
#include <future>

void functionToRun() {
  while (true) {
    Rishab::hello();
  }
}

int main() {
    std::future<void> futureVariable = std::async(std::launch::async, functionToRun);
}

Rishab.h

#ifndef __METRIC_RISHAB_H__
#define __METRIC_RISHAB_H__

class Rishab {
public:
    static void hello();

};
#endif

Rishab.cxx

#include "Rishab.h"

void Rishab::hello() {
}

当我尝试编译它时,链接器会抛出错误,

Undefined symbols for architecture x86_64:
  "Rishab::hello()", referenced from:
      functionToRun() in A.cxx.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

PS:这些文件是更大项目的一部分,所以有一个 Makefile。

我已经在网上查看了其他答案,但其中大多数都迎合static variable 未定义(仅声明)。但我的问题涉及static function

【问题讨论】:

  • 而执行链接器的实际命令是...?
  • 错误信息告诉您,链接器在尝试为每个翻译单元每个包含源代码的文件),它无法解析函数void Rishab::hello()的存在。这很可能意味着您实际上并未在调用链接器的过程中提供已编译的Rishab.cxx 文件中的目标代码。因此,它不知道这个函数是在哪里实现的。
  • 找到了。对不起这个愚蠢的问题。有一个 CMakeLists.txt,必须在其中添加文件 Rishab.cxx。现在它起作用了。如果@paddy 你发布你的答案,我可以接受答案。上面的评论为我解决了这个问题。

标签: c++ c++11 static static-methods


【解决方案1】:

错误信息告诉您链接器在尝试为每个翻译单元(即每个包含源代码的文件)组合所有单独编译的目标代码时,它无法解决存在函数void Rishab::hello()

这很可能意味着您实际上并未在调用链接器时提供已编译的Rishab.cxx 文件中的目标代码。因此,链接器不知道在哪里可以找到该函数的实现,因此它无法汇编完整的程序。

请注意,标头(通常称为接口)是声明可以跨源文件共享的符号(通常称为实现):

  • 在编译时,每个单独的源文件只需要了解接口。可以免费使用这些接口,而无需担心它们是如何实现的。这就是允许将程序拆分为许多不同部分的原因,而无需一次编译所有内容。简单来说,您的接口为实际编译的代码创建占位符。

  • 在链接时,所有已编译的部分必须连接在一起,并且所有接口都必须解析为它们的实现。如果链接器找不到实现,那就是一个错误。

每当您看到这样的符号解析错误时,最可能的原因是:

  • 您忘记定义在标头中声明的内容
  • 您在声明或定义中打错字
  • 您错误地使用了命名空间
  • 你忘了告诉链接器它需要知道的一切(例如给它所有相关的目标文件)
  • 您正在使用您的某个目标文件的陈旧/过时版本(也许您没有注意到编译失败,但您还是尝试了链接)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    相关资源
    最近更新 更多