Xcode:包含标头时未定义的符号

xcode : undefined symbols when including headers

提问人:wartonbega 提问时间:4/25/2022 最后编辑:wartonbega 更新时间:4/25/2022 访问量:838

问:

我最近开始了一个使用 swift 和 c++ 的项目。所以我安装了 Xcode 并开始使用它。我首先遇到了一些错误,但修复了主题。

但是,我仍然得到了一些Undefined symbols for architecture x86_64:

我在网上搜索,但我找不到我问题的解决方案(否则我不会问这个问题)。

这是整个错误:

  "parser(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >, Node*, int, int)", referenced from:
      utilise_file(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, bool, bool, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
  "recognize_paternes(Node*, bool)", referenced from:
      utilise_file(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, bool, bool, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
  "ast_t_rep(Node*, int)", referenced from:
      utilise_file(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, bool, bool, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
  "lex(char const*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)", referenced from:
      utilise_file(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, bool, bool, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
  "visitor(std::__1::vector<Node*, std::__1::allocator<Node*> >, bool, bool, bool)", referenced from:
      utilise_file(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, bool, bool, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

但我认为我们可以考虑:

      utilise_file(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, bool, bool, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main.o

因为这个错误似乎是多余的。

在我的文件中,我导入了头文件 (),其中我声明了 .main.cppparser.hNode *parser(vector<string>, Node *, int, int);

在 中,我调用函数:main.cpp>utilise_file(...)parser

void utilise_file(){
    ...
    vector<string> code_ref = vector<string>();
    vector<string> lexeme = lex(source.c_str(), code_ref);
    Node *ast_t = new Node();
    ast_t->value = "main";
    ast_t->type = "root";
    Node *p = parser(lexeme, ast_t, 0, int(lexeme.size()));
   ...
}

所以通常情况下,我不会收到这个错误。

在我看来,这是一个“类型”类型的问题,但我不知道是什么。

我在网上搜索了解决方案,并尝试添加 Xcode>Linking>Other Liner Flags,但没有帮助。-Xlinker

我还考虑过在编译命令行中添加链接到标头的标志,但我认为 Xcode 会自动执行此操作。(或者不是,因为我的许多标题在文件树丛中无法识别......

感谢您的帮助;)

编辑:我发现了问题,我不得不在Xcode中手动添加以前编写的头文件(没有自动完成)。

C++ Xcode C++11 链接器错误

评论

0赞 Some programmer dude 4/25/2022
您需要了解声明(告诉编译器某处存在某些东西)和定义(实际实现)之间的区别。例如,是一个声明。 是一个定义。如果项目中有多个源文件,则需要使用所有这些源文件进行生成。Node *parser(vector<string>, Node *, int, int);.Node *parser(vector<string>, Node *, int, int); { /* Some code ... */ }

答:

1赞 wartonbega 4/25/2022 #1

我发现了问题所在。

当我在 Xcode 中导入之前编写的头文件时,Xcode 没有将它们附加到项目中。

我不得不手动添加主题,现在它工作正常!

评论

0赞 Some programmer dude 4/25/2022
问题中的错误与任何文件无关。您需要学习创建和构建 C++ 程序所需的步骤:1) 编辑源代码;2)将源代码编译成目标文件;3) 将目标文件和库链接到可执行文件中。头文件仅在步骤 2 中涉及。库仅涉及步骤 3。