“未定义符号”,但函数已定义和声明,没有拼写错误
Posted
技术标签:
【中文标题】“未定义符号”,但函数已定义和声明,没有拼写错误【英文标题】:"Undefined Symbols" but functions are defined and declared, no typos 【发布时间】:2014-01-15 13:16:31 【问题描述】:我遇到了这个奇怪的问题——我定义和声明了函数,没有拼写错误,没有外部库,没有命名空间失败,没有模板,没有提到任何其他线程——但我仍然得到函数调用的“未定义符号” .
我有以下代码:
在一个 .cpp 文件中:
string print(const FanBookPost& post)
std::stringstream ss;
// notice! post.getOwner.getId! owner needs to be fan
ss << post.getOwner().getId() << ": " << post.getContent() << "(" << post.getNumLikes()
<< " likes)";
return ss.str();
该文件包括 FanBookPost.h。
然后我在 FanBookPost.h:
class FanBookPost
private:
Fan owner;
std::string content;
int numOfLikes;
int seqNum;
public:
// constructors
int getNumLikes();
std::string getContent();
Fan getOwner();
int getNumLikes() const;
std::string getContent() const;
Fan getOwner() const;
;
如您所见,我准备了 const 和常规版本。在第一个 .cpp 文件中,“post”函数得到的是 const。
我在 FanBookPost.cpp 中实现了这些功能:
class FanBookPost
private:
Fan owner;
std::string content;
int numOfLikes;
int seqNum;
public:
//constructors
int getNumLikes()
// code
std::string getContent()
// code
Fan getOwner()
// code
int getNumLikes() const
// code
std::string getContent() const
// code
Fan getOwner() const
// code
;
我尝试用谷歌搜索答案并搜索 *** 线程,但正如我所说,找不到任何明显的问题。请帮我解决这个“未定义的符号”问题,因为它已经让我发疯了。
【问题讨论】:
它在抱怨什么符号?我猜你还需要将string print(const FanBookPost& post);
放在头文件中(只是签名;不是它的正文)。
你是如何编译和链接你的源文件的?请显示命令行和错误信息。
【参考方案1】:
我在 FanBookPost.cpp 中实现了这些功能
不,你没有!您已经重新定义了类,而不仅仅是定义了函数。这打破了单一定义规则,所以所有的事情都可能出错。特别是,这些函数是内联的,所以它们不能被其他源文件使用;因此你的错误。
源文件应该看起来更像
#include "FanBookPost.h" // include the class definition
// Define the member functions
int FanBookPost::getNumLikes()
// code
// and so on
或者,您可以在标题中的类定义中定义函数,或者在类定义之后使用inline
说明符;如果它们非常小,这可能是合适的,因为它为编译器提供了更好的优化机会。但无论哪种情况,您只能在标题中定义一次类。
【讨论】:
天哪,我不敢相信我做到了。谢谢你指出来!!【参考方案2】:当您使用 const
引用 FanBookPost
时,您需要将 getOwner()
设为 const
:
Fan getOwner() const;
(无论如何都应该是,如果它是一个简单的 getter)。
【讨论】:
以上是关于“未定义符号”,但函数已定义和声明,没有拼写错误的主要内容,如果未能解决你的问题,请参考以下文章
Apple Mach-O 链接器错误/架构 i386 的未定义符号: