我有一些代码分布在三个文件中,我想使用第四个“gloabls”文件来存储一些物理常量,例如pi的值。这样可以避免重复定义pi = 4*atan(1.0)
。在探索之后,我尝试过创建一个全局头文件:
/*globals.h*/
extern double g_pi;
和一个全局cpp文件:
/*globals.cpp*/
#include "math.h"
#include "globals.h"
double g_pi = 4*atan(1.0);
然后我将这些文件包含在我的主文件中:
/*mainFile.cpp*/
//Include math and other libraries
#include globals.h"
int main() {
/*
....
*/
double x = 2*g_pi
/*
....
*/
}
这给了我一个未定义的g_pi参考错误。我在Ubuntu上使用g ++编译器。希望它是一个简单的修复!非常感谢您的建议。如果需要更多细节,我很乐意提供。
答案 0 :(得分:14)
你可以简单地使用include中的M_PI(还有其他常量)。
编辑:您的设置正确无误。我得到了一个有效的例子:
globals.h
extern double g_tst;
globals.cpp
#include "globals.h"
double g_tst = 4.0;
的main.cpp
#include "globals.h"
#include <stdio.h>
#include <stdlib.h>
int main()
{
fprintf (stderr, "g_tst = %lf \n", g_tst);
return 0;
}
问题出在你的构建系统中
请参阅wikipedia
答案 1 :(得分:6)
我认为问题是你有#include gobals.h而不是#include globals.h。这将为您提供未定义的引用,因为它不插入globals.h。当C ++预编译器找不到头文件时,它不会失败。相反,您在编译时会收到未定义的引用消息。
答案 2 :(得分:2)
链接的顺序可能是问题所在。尝试将全局目标文件链接为最后一个。
答案 3 :(得分:1)
g_pi musst不能在一个翻译单元中声明为extern。 你可以使用一个小的#define来实现这个
globals.cpp中的
#define MY_EXTERN_CPP
> globals.h中的
#ifdef MY_EXTERN_CPP
#define MY_CONFIGURATION_EXTERN
#else
#define MY_CONFIGURATION_EXTERN extern
#endif
MY_CONFIGURATION_EXTERN double g_pi;
所以除了globals.cpp
之外,g_pi将包含在你包含它的所有翻译单元中答案 4 :(得分:0)
我有同样的问题。我正在使用CMAKE,问题是我没有将globals.cpp文件放入CMAKE可执行文件中。这个问题应该是类似的东西,实现本身没有错。