繁体   English   中英

MacOS 中架构 arm64 的未定义符号

[英]Undefined symbols for architecture arm64 in MacOS

当我编写两个函数 xxxx 作为 uni 工作的一部分时,发生以下错误。 我使用的 IDE 是Visual Studio Code

问题是,当我尝试编译文件夹code/myIO中的单个文件时,它抛出了一个错误:

(我已经用($)替换了文件夹的路径。我 promise 问题不存在)

cd ($) && clang++ r.cpp -o ($)/r -D LOCAL -Wall -O2 -fsanitize=undefined

Undefined symbols for architecture arm64:
  "_Tp::INT", referenced from:
      split(char const*, _Tp*) in r-ebf422.o
  "_Tp::fmt", referenced from:
      split(char const*, _Tp*) in r-ebf422.o
  "_Tp::str", referenced from:
      split(char const*, _Tp*) in r-ebf422.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

更重要的是,当我尝试链接一些文件时,发生了类似的错误。

clang++ -shared -o libmystdio.so myscanf.o myprintf.o
Undefined symbols for architecture arm64:
  "_Tp::INT", referenced from:
      split(char const*, _Tp*) in myscanf.o
      split(char const*, _Tp*) in myprintf.o
  "_Tp::fmt", referenced from:
      split(char const*, _Tp*) in myscanf.o
      split(char const*, _Tp*) in myprintf.o
  "_Tp::str", referenced from:
      split(char const*, _Tp*) in myscanf.o
      split(char const*, _Tp*) in myprintf.o
  "_Tp::LONG", referenced from:
      split(char const*, _Tp*) in myscanf.o
      split(char const*, _Tp*) in myprintf.o
  "_Tp::LONGLONG", referenced from:
      split(char const*, _Tp*) in myscanf.o
      split(char const*, _Tp*) in myprintf.o
  "_out_buf", referenced from:
      myprintf(char const*, ...) in myprintf.o
  "_out_idx", referenced from:
      myprintf(char const*, ...) in myprintf.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [libmystdio.so] Error 1

如果你想知道我写了什么,请点击这里 不过还没写完,不知道大家有没有兴趣……(我发了几条评论,大部分都是中文的,给群友看)

而且,文件夹代码中的文件不受影响。 可以正常编译运行。只有文件夹code/myIO出错了。

这是我的 clang++ 版本:

clang++ -v
Apple clang version 12.0.5 (clang-1205.0.22.11)
Target: arm64-apple-darwin20.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

提前感谢您的帮助!

你有一个没有定义的声明。

utilities.h有:

class _Tp {
  // [...]
public:
  // [...]
  static const int INT = 1, SHORT = 2, LONG = 3, LONGLONG = 4,
      FLOAT = 10, DOUBLE = 11, LONGDOUBLE = 12;

用初始化器声明_Tp::INT等,但没有定义它们。 如果您 ODR 使用这些值,那么您需要对它们进行定义,这意味着需要指定一个位置来保存程序中这些常量的 memory 的字节。 [0]

执行此操作的正常方法是使用匹配的utilities.cpp

const int _Tp::INT;
const int _Tp::SHORT;
const int _Tp::LONG;
const int _Tp::LONGLONG;
const int _Tp::FLOAT;
const int _Tp::DOUBLE;
const int _Tp::LONGDOUBLE;

但在您的情况下,您可能需要考虑切换到枚举! 为此,您将在utilities.h中编写:

class _Tp {
  // [...]
public:
  // [...]
  enum { INT = 1, SHORT = 2, LONG = 3, LONGLONG = 4,
      FLOAT = 10, DOUBLE = 11, LONGDOUBLE = 12 };

那么你不需要utilities.cpp

[0] 有一种特殊情况允许 ODR 使用整数类型的值,而无需在狭窄的环境中定义,但我建议程序员不要依赖它。 非专家对代码进行了无害的更改,并得到一个令人困惑的链接错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM