[英]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.