- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我敢肯定, undefined symbol /引用感觉就像是一个在这里被打得死去活来的话题,但我遇到了一个奇怪的问题。看我的previous question了解一些背景信息。
我正在开发一个小程序,它编译正常,没有警告或错误或任何东西。然后,我更新了 CMake,我得到了这些错误:
Undefined symbols for architecture x86_64:
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(char const*)", referenced from:
GetName() in n2-af52d6.o
Expression() in n2-af52d6.o
Term() in n2-af52d6.o
GetNum() in n2-af52d6.o
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string()", referenced from:
GetName() in n2-af52d6.o
GetNum() in n2-af52d6.o
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator+=(char)", referenced from:
GetName() in n2-af52d6.o
GetNum() in n2-af52d6.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我认为这很奇怪,因为这些错误似乎来自标准库本身。
这是完整的程序:
//
// ncc.cpp
// Nathanael Epps
//
#include <string>
#include <iostream>
#include <sstream>
typedef std::string string;
static char look = '\0';
static const string Cmt = "## ";
static const string Tab = "\t";
static const string TabTab = Tab + Tab;
static const string TabTabTab = TabTab + Tab;
static void GetChar()
{
look = getchar();
while (look == ' ' || look == '\t')
look = getchar();
}
template <class T>
static string ToString(T x)
{
std::stringstream ss;
ss << x;
return ss.str();
}
static void Error(string mssg)
{
fprintf(stderr, "\n%s", mssg.c_str());
}
static void Abort(string mssg)
{
Error(mssg);
exit(0);
}
static void Expected(string expected)
{
Abort(expected + " expected.\n");
}
static void Match(char x)
{
if (x == look)
GetChar();
else
Expected(string("\"") + x + "\"");
}
static bool IsAlpha(char c)
{
c = toupper(c);
return 'A' <= c && c <= 'Z';
}
static bool IsDigit(char c)
{
return '0' <= c && c <= '9';
}
static bool IsAlNum(char c)
{
return IsAlpha(c) || IsDigit(c);
}
static string GetName()
{
if (!IsAlpha(look))
Expected("Alpha");
std::string name;
while (IsAlNum(look)) {
name += look;
GetChar();
}
return name;
}
static string GetNum()
{
if (!IsDigit(look))
Expected("Integer");
string num;
while (IsDigit(look)) {
num += look;
GetChar();
}
return num;
}
static void EmitLn(string s)
{
printf("\t%s\n", s.c_str());
}
static void EmitLn(char c)
{
printf("\t%c\n", c);
}
static void WriteLn(string s)
{
printf("%s\n", s.c_str());
}
static void Init()
{
GetChar();
}
static void Identifier()
{
auto name = GetName();
if (look == '(')
{
Match('(');
Match(')');
EmitLn("movq" + Tab + "$0, %rax");
EmitLn("callq" + Tab + "_" + name + TabTab + Cmt + "Leaves result in %rax");
}
else
{
EmitLn("movq" + Tab + name + "(%rip), %rax");
}
}
static void Expression();
static void Factor()
{
if (look == '(')
{
Match('(');
Expression();
Match(')');
}
else if (IsAlpha(look))
{
Identifier();
}
else
{
EmitLn("movq" + Tab + "$" + GetNum() + ", %rax");
}
}
static void Multiply()
{
Match('*');
Factor();
EmitLn("popq" + Tab + "%rbx");
EmitLn("imulq" + Tab + "%rbx, %rax");
EmitLn("movq" + Tab + "$0, %rdx");
}
static void Divide()
{
Match('/');
Factor();
// Right now, stack has top number
// %rax has bottom number
// move the bottom number to %rbx
EmitLn("movq" + Tab + "%rax, %rbx");
// move the top number to %rdx:%rax
EmitLn("popq" + Tab + "%rax");
EmitLn("cqto" + TabTabTab + Cmt + "%rax --> %rdx:%rax");
// do division
EmitLn("idivq" + Tab + "%rbx");// + TabTab + Cmt + "leaves result in %rax");
// clear %rdx
EmitLn("movq" + Tab + "$0, %rdx");// + Tab + Cmt + "clear %rdx");
}
static void Term()
{
Factor();
while (look == '*' || look == '/')
{
EmitLn("pushq" + Tab + "%rax");
if (look == '*')
Multiply();
else if (look == '/')
Divide();
else
Expected("Mult/Div Op");
}
}
static void Add()
{
Match('+');
Term();
EmitLn("popq" + Tab + "%rbx");
EmitLn("addq" + Tab + "%rbx, %rax");
}
static void Sub()
{
Match('-');
Term();
EmitLn("popq" + Tab + "%rbx");
EmitLn("subq" + Tab + "%rbx, %rax");
EmitLn("neg " + Tab + "%rax");
}
static bool IsAddop(char c)
{
return c == '+' || c == '-';
}
static void Expression()
{
if (IsAddop(look))
EmitLn("movq" + Tab + "$0, %rax");
else
Term();
while (IsAddop(look))
{
EmitLn("pushq" + Tab + "%rax");
if (look == '+')
Add();
else if (look == '-')
Sub();
else
Expected("Add/Sub Op");
}
}
static void Assignment()
{
auto name = GetName();
Match('=');
Expression();
//EmitLn("movq" + Tab + "%rax, " + name + "(%rip)");
EmitLn("movq" + Tab + "%rax, (variable " + name + ")");
}
static string NewLabel()
{
static unsigned count = 0;
return "L" + ToString(count++);
}
static void PostLabel(string lname)
{
WriteLn(lname + ":");
}
static void Condition()
{
EmitLn("<condition>");
}
static void Other()
{
EmitLn(look);
GetChar();
}
static void Block();
static void DoIf()
{
Match('i');
string l = NewLabel();
Condition();
EmitLn("jne" + Tab + l);
Block();
Match('e');
PostLabel(l);
}
static void Block()
{
while (look != 'e')
{
if (look == 'i')
DoIf();
else
Other();
}
}
static void Program()
{
Block();
if (look != 'e')
Expected("e");
EmitLn(Cmt + "Clean up stack, and such");
EmitLn("retq");
GetChar();
}
int main()
{
Init();
(void) Assignment;
Program();
if (look != '\n')
Expected("Newline");
return EXIT_SUCCESS;
}
但是,从函数中删除 static
限定符会使错误消失。 (此外,如果您没有弄清楚,该程序是某种小型编译器。)
什么给了?
编辑:
我通常会通过简单地输入链接
g++ ncc.cpp -std=c++14 -Wall -o ncc
运行 g++ --version
得到这个:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin17.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
这个问题不是 this question 的重复问题因为这个答案是关于在文件范围内声明的静态变量导致文件本身中的 undefined symbol ,而我的问题是关于在文件范围内声明的静态函数导致标准库中的 undefined reference 。
最佳答案
关于c++ - 为什么使函数 "static"导致我的程序有 undefined symbol ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51237207/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!