请考虑以下
/*utils.h*/
#include <cstdio>
#include <iostream>
//#include some other files, including <string>
//ifndef ... and such macro
extern string configpath;
extern void writelog(string, string);
extern string get_fromfile(string, string);
//end the said macro
然后我们
/*utils.cpp*/
//all necessary includes, including <string>
#include "utils.h" //they are in the same folder, as the following main .cpp
void writelog(string msg, string location = "lookinconfigfile")
{
if (location == "lookinconfigfile")
{
get_fromFile(configpath, "logpath");
//the function correctly returns the path to logfile, tested separatly.
}
...
}
string get_formFile(string flpt, string wht)
{...}
然后在main.cpp中,我包含utils.h,并将configpath设置为指向一个包含日志文件路径的文件。
现在g++ -c utils.cpp -std=c++11
生成utils.o
g++ -c main.cpp -std=c++11
生成main.o
在将configpath作为全局变量引入之前,通过明确提到configpath,即对每次出现进行硬编码,我能够做到这一点:
g++ main.o -o main
这将生成main作为可执行文件,其行为符合预期。
但现在我明白了:
main.o: In function `writelog(std::string, std::string)':
main.cpp:(.text+0x2ce): undefined reference to `configpath
另外,如果我在get_fromFile
中保留utils.cpp _after_ writelog
的定义,尽管在utils.h中有原型,我会得到get_fromFile is not defined
。
我在哪里搜索寻找解决方案?
编辑:正如user2079303建议的那样,是的,它是utils.h,而不是utils.cpp,谢谢。
edit2:正如bobah所提到的,我的代码实际上是正确的,只是在这里输入错误。遗憾。
答案 0 :(得分:1)
您需要define
您的变量让编译器知道要将其放入哪个目标文件。在头文件中提及extern string configpath;
只是告诉编译器某处会有这个变量,留下未解析的引用并让链接器解析它。
添加到您的main.cpp:
string configpath;
答案 1 :(得分:0)
在最后一次调用gcc时,你只链接main.o,而不是utils.o。