我想在文件 nstest1.h 和 nstest2.h 中声明两个类 C1 和 C2 它们分别在文件 nstest1.cpp 和 nstest2.cpp 中定义。这两个类都在相同的命名空间下定义。
以下是文件:
//nstest1.h
namespace Mine{
class C1{
public:
void callme();
};
}
//nstest2.h
namespace Mine {
class C2 {
public:
void callme();
};
}
//nstest1.cpp
#include<iostream>
#include "nstest1.h"
using namespace std;
using namespace Mine;
void Mine::C1::callme(){
std::cout << "Please call me " << std::endl;
}
//nstest2.cpp
#include<iostream>
#include "nstest2.h"
using namespace std;
using namespace Mine;
void Mine::C2::callme(){
std::cout << "Please call me too" << std::endl ;
}
以下文件尝试使用命名空间 Mine 。
来使用此类//nstest.cpp
#include<iostream>
#include "nstest1.h"
#include "nstest2.h"
using namespace std;
using namespace Mine;
int main(){
Mine::C1 c1;
Mine::C2 c2;
c1.callme();
c2.callme();
return 0;
}
当我使用命令“g ++ nstest.cpp”编译时,出现以下错误:
/tmp/cc2y4zc6.o: In function `main':
nstest.cpp:(.text+0x10): undefined reference to `Mine::C1::callme()'
nstest.cpp:(.text+0x1c): undefined reference to `Mine::C2::callme()'
collect2: error: ld returned 1 exit status
如果定义被移动到声明文件(nstest1.h和nstest2.h),它可以正常工作。不知道这里发生了什么。我错过了什么吗? 在此先感谢:)。
答案 0 :(得分:3)
构建程序时需要包含其他.cpp文件。
选项1:编译所有文件并在一个命令中构建可执行文件
g++ nstest.cpp nstest1.cpp nstest2.cpp -o nstest
选项2:单独编译每个文件,然后在
之后构建可执行文件g++ -c nstext1.cpp
g++ -c nstest2.cpp
g++ -c nstest.cpp
g++ nstest.o nstest1.o nstext2.o -o nstest
答案 1 :(得分:1)
您的问题发生在链接时。你的标题很好。但是你应该编译其他的cpp文件。