C++未定义引用(即使包含了头文件)

13

我无法让这段简单的代码在不显式地将TestClass.cpp文件包含到main.cpp文件中的情况下编译通过。我做错了什么?谢谢!

以下是代码:

TestClass.h

#ifndef TESTCLASS_H_
#define TESTCLASS_H_

class TestClass
{
    public:
        static int foo();
};

#endif

测试类.cpp

#include "TestClass.h"

int TestClass::foo() { return 42; }

主函数文件:main.cpp

#include <iostream>

#include "TestClass.h"

using namespace std;

int main()
{
    cout << TestClass::foo() << endl;

    return 0;
}

这里是错误信息:

g++ main.cpp -o main.app
/tmp/ccCjOhpy.o: In function `main':
main.cpp:(.text+0x18e): undefined reference to `TestClass::foo()'
collect2: ld returned 1 exit status
2个回答

21

将TestClass.cpp包含到命令行中,这样链接器就可以找到函数定义:

g++ main.cpp TestClass.cpp -o main.app

或者,将每个文件编译为单独的目标文件,然后告诉编译器将它们链接在一起(它会将它们转发到链接器)。

g++ -c main.cpp -o main.o
g++ -c TestClass.cpp -o TestClass.o
g++ main.o TestClass.o -o main.app

1
多奇怪啊!我以前从未遇到过这个问题。我是C++的新手,我想我一直都是用IDE来做这件事的。难怪!谢谢! - Scott
3
@Scott - 这就是为什么你应该花些时间在命令行中。它可以让你看到IDE隐藏的东西... - Darius Kucinskas
我不同意重命名文件的做法。现在的文件名已经根据其内容进行了命名,并且与内容的大小写一致(如函数“main”和类“TestCase”)。 - camh
我同意。这也是一致的。我会更改我的答案。好发现。 - Johannes Schaub - litb

0

你没有编译和链接 TestClass.cpp(其中包含 foo() 的实现)。因此,编译器会抱怨你试图使用未定义的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接