cpp文件和h文件之间的通信

时间:2014-02-05 17:34:32

标签: c++11 header-files

请考虑以下

/*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所提到的,我的代码实际上是正确的,只是在这里输入错误。遗憾。

2 个答案:

答案 0 :(得分:1)

您需要define您的变量让编译器知道要将其放入哪个目标文件。在头文件中提及extern string configpath;只是告诉编译器某处会有这个变量,留下未解析的引用并让链接器解析它。

添加到您的main.cpp:

string configpath;

答案 1 :(得分:0)

在最后一次调用gcc时,你只链接main.o,而不是utils.o。