终端中的“架构 x86_64 的未定义符号”,但 xcode 中没有错误

Posted

技术标签:

【中文标题】终端中的“架构 x86_64 的未定义符号”,但 xcode 中没有错误【英文标题】:"Undefined symbols for architecture x86_64" in terminal but no error in xcode 【发布时间】:2014-12-03 11:58:18 【问题描述】:

这让我发疯了。我不明白错误告诉我什么,它只在我使用终端编译并调用函数时出现。如果我包含 class.h,则创建一个名为“first”的成员,没有错误,但如果我调用函数“first.coutTest()”,则会出现错误,但当我使用 XCODE 时没有错误!

为什么我在终端出现错误?!

这是 main.cpp

#include <iostream>
#include <string>
#include "class.h"
using namespace std;

int main(void)
    TestClass first;    
    first.coutTest();   
    cout << "test" << endl; 
    return 0;

这是我的课。h

#include <iostream>
#include <string>
using namespace std;

class TestClass
    int number;
public:
    void coutTest();
;

这是我的class.cpp

#include <iostream>
#include "class.h"
using namespace std; 

void TestClass::coutTest()
    cout << "class test" << endl;

再一次,当我在 xcode 中运行它时没有错误,所以 xcode 必须做一些我没有做的事情。有人可以告诉我发生了什么吗?

我得到的具体错误是当我使用makeg++ 时是一样的:

Undefined symbols for architecture x86_64:
  "TestClass::coutTest()", referenced from:
      _main in main-f2c376.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

我在 MacBook Pro(15 英寸,2011 年末)处理器 2.2 GHz Intel Core i7 上运行 Yosemite 10.10.1,图形处理器 Intel HD Graphics 3000 384 MB。


编辑更新:

所以现在当我包含“class.cpp”而不是“class.h”时,我已经让它在终端中工作了。 我的理解是这是不好的做法,所以我很犹豫要不要这样做。 为什么 xcode 让我包含不同的文件。为什么程序在终端中的工作方式不同?

【问题讨论】:

你是如何在终端编译的?你用的是哪个命令? 【参考方案1】:

您需要编译所有的 cpp 文件。因此这样做:

g++ main.cpp class.cpp

或者,要单独编译和链接 cpp 的 .. ,使用 -c 选项这样做:

g++ -c main.cpp
g++ -c class.cpp
g++ main.o class.o

或者,如果所有 cpp 文件都在同一个目录下,请导航到该目录并执行以下操作:

g++ *.cpp

【讨论】:

以上是关于终端中的“架构 x86_64 的未定义符号”,但 xcode 中没有错误的主要内容,如果未能解决你的问题,请参考以下文章

架构 x86_64 的未定义符号,颤振 ios

编译时错误“架构 x86_64 的未定义符号”是啥意思?

架构 x86_64 的未定义符号:El Capitan [重复]

架构 x86_64 / i386 的未定义符号

GoogleMapsSDK:架构 x86_64 的未定义符号

Cordova - 架构 x86_64 的未定义符号