簡體   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