3

我有 3 个文件要用 G++ 编译,主文件是这样的:

//main.cpp

#include "test.hpp"

int main(int argc,char** args) {
  //
}

第二个文件是头文件:

//test.hpp

namespace shared {
  class test {

    //constructor 
    test();
  };
}

最后一个文件是 test.hpp 的代码文件

//test.cpp

shared::test::test() {
  //
}

我以这种方式使用 G++ 进行编译:

g++ -c main.cpp test.cpp

但是,G++ 抱怨文件“test.cpp”中未定义的标识符“shared”。在命令行中,我已经传入了包含头文件的文件“main.cpp”。如何解决这个问题?我只想让所有的 '#include' 都在 main.cpp 中,而不是其他地方。

4

2 回答 2

3

#include "test.hpp"在开头添加test.cpp

编译器不关心命令行中文件的顺序。它只影响链接器。另请注意,编译多文件项目的常用方法是将它们中的每一个编译为不同的子对象,如下所示:

g++ main.cpp -o main.o
g++ test.cpp -o test.o
ld main.o test.o -o program[.exe]

这允许您只重新编译真正改变的文件。如果你想了一会儿,你会发现一个.cpp文件可以包含许多头,没有问题;但是,当您的标头开始包含许多标头时,编译时间将会增加。前向声明可以帮助解决这些问题,但是对于您的简单示例,简单的解决方案将起作用。

于 2012-09-07T07:23:45.013 回答
1

你必须#include "test.hpp"在你的test.cpp文件中说。命名空间声明必须是已知的。

于 2012-09-07T07:24:15.260 回答