我正在尝试访问头文件中命名空间中定义的变量和函数。但是,我得到了错误:xor.cpp:(.text+0x35): undefined reference to "the function in header file" collect2: error: ld returned 1 exit status
。在我看来,在读取此post之后,编译步骤就可以了,并且还因为我可以访问此头文件中的变量,但是调用该函数将返回上述错误。我的问题是:如何从main.cpp访问 namespace 中的那些函数?我究竟做错了什么 ?
类的情况对我来说很清楚,但是在这里我不明白,因为我不应该创建对象,因此只需在前面调用 namespace 就可以了(?)。
编辑
在Maestro建议更改之后,我已经按照以下方式更新了代码,但仍然无法正常工作。我得到的错误是相同的。如果我定义using NEAT::trait_param_mut_prob = 6.7;
,则会出现错误:xor.cpp:127:36: error: expected primary-expression before ‘=’ token
主要c++
#include "experiments.h"
#include "neat.h"
#include <cstring>
int main(){
const char *the_string = "test.ne";
bool bool_disp = true;
NEAT::trait_param_mut_prob;
trait_param_mut_prob = 6.7;
NEAT::load_neat_params(the_string ,bool_disp);
std::cout << NEAT::trait_param_mut_prob << std::endl;
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
}
#endif
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
return false;
};
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
。 using
或完全限定调用,因为如我所见,您打算在main中重新声明它们以避免完全限定它们:in main:int main()
{
using NEAT::trait_param_mut_prob;
using NEAT::load_neat_params;
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);
// or fully-qualify:
//NEAT::load_neat_params(the_string, bool_disp);
//NEAT::trait_param_mut_prob = 6.7;//works perfectly
}
load_neat_params
没有返回bool
值也是错误的。因此,使其返回true
或false
。