使用SimpleJSON库(C ++)的多个定义

时间:2018-04-18 11:24:52

标签: c++ linker simplejson multiple-definition-error

我正在用C ++编写一个程序,使用SimpleJSON作为我选择的JSON库,并且遇到了一个奇怪的错误,其中以下(非常简单的)文件在链接时会产生大量的错误消息:

jsonobject.hpp:

#ifndef _JSONOBJECT
#define _JSONOBJECT

#include "../../lib/simplejson/json.hpp"

int foo();

#endif

jsonobject.cpp:

#include "jsonobject.hpp"

int foo()
{
   return 0;
}

main.cpp中:

#include "jsonobject.hpp"

int main()
{
    return foo();
}

错误消息(我正在使用g++ *.cpp -std=c++11进行编译):

/tmp/ccMoY6Vl.o: In function `json::Array()':
main.cpp:(.text+0x1cd): multiple definition of `json::Array()'
/tmp/ccjd4YF7.o:jsonobject.cpp:(.text+0x1cd): first defined here
/tmp/ccMoY6Vl.o: In function `json::Object()':
main.cpp:(.text+0x23e): multiple definition of `json::Object()'
/tmp/ccjd4YF7.o:jsonobject.cpp:(.text+0x23e): first defined here
/tmp/ccMoY6Vl.o: In function `json::operator<<(std::ostream&, json::JSON const&)':
main.cpp:(.text+0x2af): multiple definition of `json::operator<<(std::ostream&, json::JSON const&)'
/tmp/ccjd4YF7.o:jsonobject.cpp:(.text+0x2af): first defined here
/tmp/ccMoY6Vl.o: In function `json::JSON::Load(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
main.cpp:(.text+0x1a0c): multiple definition of `json::JSON::Load(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/tmp/ccjd4YF7.o:jsonobject.cpp:(.text+0x1a0c): first defined here
collect2: error: ld returned 1 exit status

我在这里做错了什么,或者这是SimpleJSON库(Here it is on GitHub)的错误?

1 个答案:

答案 0 :(得分:1)

是的,您使用的SimpleJSON库存在问题。快速浏览一下json.hpp,确认它在头文件中定义了几个命名空间范围的非模板函数,而没有标记它们inline。这使得不可能包含来自多个翻译单元的标题,这严重降低了它的使用方式。

已经报告on SimpleJSON's git issue tracker。看起来至少有一个人尝试并在个人分支机构上进行了修复,但它尚未被拉到主分支。您可以从该分支获取代码以进行尝试。