make和std :: logic_error

时间:2011-09-18 19:37:46

标签: c++ makefile

使用make时遇到以下错误。因此,我在命令行编译了相同的程序,以检查我的C ++代码中是否存在问题,但它在命令行上完全正常。

g++ -o Cmain.exe Cmain.o -lmysqlclient -lboost_date_time -L ../lib -L/usr/local/lib -L/usr/lib/mysql 
./Cmain.exe
terminate called after throwing an instance of 'std::logic_error'
      what():  basic_string::_S_construct NULL not valid
    make: *** [Cmain.exe] Aborted
    make: *** Deleting file `Cmain.exe'

有关可能导致此错误的原因及其修复方法的任何建议。

3 个答案:

答案 0 :(得分:3)

从已编辑的问题中

编辑,现在很清楚CMain.exe没有被执行,而是被构建。

同样的情况适用(见下文),但一旦有更多新信息,我会发布更多相关提示。坚持


<子>

我可以打赌80%的程序会调用std::getenv

getenv(...)

并且不检查null(0)的返回值。如果然后从中构造一个std :: string,则报告的异常是 expected

在源代码中搜索getenv(...)并替换代码,例如:

 std::string s = getenv("SOMEVAR");   // WRONG!

by,例如

 const char* raw = getenv("SOMEVAR");
 std::string s = raw?raw:"";         // RIGHT!

然后,您可以使用s.empty()查看变量是否具有值(您无法再查看它是否存在于环境中,因为std :: string不能表示'null' - 只有空字符串)。


PS。:背景/偏离主题:

  

我敢打赌,由于环境差异,环境不同   经常引起麻烦/混淆make引擎(CMake,nmake,SCons等)特别是SCons默认是非常严格的:它甚至不向环境添加$ HOME变量,例如ccache / ccontrol设置。   

答案 1 :(得分:2)

尝试使用NULL指针构建std::string

答案 2 :(得分:-2)

这是make程序本身的一个问题。将其报告给该计划的作者。