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