我正在尝试访问头文件中名称空间中定义的变量和函数。但是,我得到了错误:xor.cpp:(.text+0x35): undefined reference to "the function in header file" collect2: error: ld returned 1 exit status
。在我看来,在阅读此post之后,编译步骤就可以了,并且还因为我可以访问此头文件中的变量,但是调用该函数将返回上述错误。我的问题是:如何从main.cpp访问名称空间中的那些函数?我究竟做错了什么 ?
我知道类的情况,但是在这里我不明白,因为我不应该创建对象,因此只需在前面调用名称空间就可以了(?)。任何帮助将不胜感激。
Main c ++
#include "neat.h"
#include <cstring>
double NEAT::trait_param_mut_prob; //NEAT is the namespace
bool NEAT::load_neat_params(const char *filename, bool output); //function defined in the namespace
int main(){
const char *the_string = "test.ne";
bool bool_disp = true;
trait_param_mut_prob = 6.7;//works perfectly
load_neat_params(the_string ,bool_disp); //doesn't work
return 0;
}
neat.h
#ifndef _NERO_NEAT_H_
#define _NERO_NEAT_H_
#include <cstdlib>
#include <cstring>
namespace NEAT {
extern double trait_param_mut_prob;
bool load_neat_params(const char *filename, bool output = false); //defined HERE
}
neat.cpp
#include "neat.h"
#include <fstream>
#include <cmath>
#include <cstring>
double NEAT::trait_param_mut_prob = 0;
bool NEAT::load_neat_params(const char *filename, bool output) {
//prints some stuff
};
Makefile
neat.o: neat.cpp neat.h
g++ -c neat.cpp
您正在违反“ ODR”规则:在源文件trait_param_mut_prob
中两次定义了load_neat_params
和neat.cpp
,在main.cpp
中定义了第二次,因此只需从main.cpp中删除这些行:]
//double NEAT::trait_param_mut_prob; //NEAT is the namespace //bool NEAT::load_neat_params(const char* filename, bool output); //function defined in the namespace
并在标题
#endif
中添加neat.h
。
load_neat_params
不会返回bool
值也是错误的。因此,使其返回true
或false
。