我有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中,而不是在其他地方。
答案 0 :(得分: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
文件可以包含许多标题而没有问题;但是,当您的标题开始包含许多标题时,编译时间会增加。前向声明可以帮助解决这些问题,但是通过简单的示例,简单的解决方案就可以工作。
答案 1 :(得分:1)
您必须在#include "test.hpp"
文件中说test.cpp
。必须知道名称空间声明。