C++ 构造函数中体系结构 x86_64 的 GCC 未定义符号

Posted

技术标签:

【中文标题】C++ 构造函数中体系结构 x86_64 的 GCC 未定义符号【英文标题】:GCC Undefined symbols for architecture x86_64 in C++ Constructor 【发布时间】:2013-11-14 21:27:58 【问题描述】:

我刚刚启动了一个新项目,但我的类骨架没有编译。我收到的编译器错误是:

Undefined symbols for architecture x86_64:
  "SQLComm::ip", referenced from:
      SQLComm::SQLComm(int, std::__1::basic_string<char, std::__1::char_traits<char>,     std::__1::allocator<char> >) in SQLComm.o
  "SQLComm::port", referenced from:
  SQLComm::SQLComm(int, std::__1::basic_string<char, std::__1::char_traits<char>,     std::__1::allocator<char> >) in SQLComm.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我不知道为什么我的代码无法编译...这是错误的类:

SQLComm.h:

#ifndef __WhisperServer__SQLComm__
#define __WhisperServer__SQLComm__

#include <iostream>
#include <string>

class SQLComm 
public:
//Local vars
static int port;
static std::string ip;

//Public functions
void connect();
SQLComm(int sqlport, std::string sqlip);
~SQLComm();
private:

;



#endif /* defined(__WhisperServer__SQLComm__) */

这是 SQLComm.cpp:

#include "SQLComm.h"


SQLComm::SQLComm(int sqlport, std::string sqlip)
ip = sqlip;
port = sqlport;


SQLComm::~SQLComm()



void SQLComm::connect()


系统是OSX10.9,编译器是GCC(在xCode中)。

如果有人能告诉我为什么会出现此错误,我会非常高兴。提前致谢! :)

【问题讨论】:

我不知道为什么当我发布这个时缩进消失了,但由于程序真的很短,我会让它保持这种状态。 【参考方案1】:

您已声明静态变量,但尚未定义它们。你需要添加这个

int SQLComm::port;
std::string SQLComm::ip;

到您的SQLComm.cpp 文件。

虽然...考虑一下,这可能不是你想要的。您打算声明 非静态 成员变量,例如,SQLComm 的每个实例都应该包含这些变量,对吧?在这种情况下,只需删除 static(并且不要将上述内容添加到您的 .cpp 文件中。

【讨论】:

太棒了,谢谢!来自 Java 和 C,我习惯了 Java 的 final 和 C 风格的静态。再次感谢:)【参考方案2】:

您需要定义静态类变量。试试

int SQLComm::port;
std::string SQLComm::ip;

在 SQLComm.cpp 中。

注意:很可能,您不想将这两个变量都声明为静态类变量,而是声明为普通实例变量。

【讨论】:

以上是关于C++ 构造函数中体系结构 x86_64 的 GCC 未定义符号的主要内容,如果未能解决你的问题,请参考以下文章

简单构造函数的复杂编译器输出

X86-64和ARM64用户栈的结构 ---目录

C++ 库编程错误:ld:未找到架构 x86_64 的符号

C++ FFT 实现(架构 x86_64 的未定义符号)

使用 GNU 汇编器在 x86_64 中调用 printf

C++ 错误:架构 x86_64 的未定义符号