sheredom / json.h

🗄️ single header json parser for C and C++
The Unlicense
698 stars 77 forks source link

Re-definition errors under GCC #86

Closed CBradDC closed 1 year ago

CBradDC commented 1 year ago

Hey just wanted to say that using json.h has so far been an absolute pleasure. I had tried some other C/C++ JSON parsing libs and was not pleased. Came across yours and it's been just what I was looking for. Really admire the C style implementation too.

Have run into one issue though. I'm compiling under GCC and when I include the header in one implementation file it's just fine, but if I include it in more than one, GCC throws up an ocean of errors relating to it's global functions already being declared elsewhere.

I've tried some tests with modifying the json.h code, thinking maybe some pre-proc macros aren't having their intended effects, but have come up with nothing so far. My current temporary solution has been to have multiple headers for my different types of parsing I'm conducting, but put the implementations all in one .cpp file.

Am I missing something really obvious here? Can get you exact errors if that helps.

Thanks so much.

sheredom commented 1 year ago

Can you paste the errors aye?

CBradDC commented 1 year ago

obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z22json_hexadecimal_digitc':| c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\char_traits.h|262|multiple definition of.weak.Z22json_hexadecimal_digitc.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:c:\program files (x86)\codeblocks\mingw\bin..\lib\gcc\mingw32\4.4.1\include\c++\new|101|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z22json_hexadecimal_valuePKcmPm':| F:\demo\project\source\engine\middleware\json.h|478|multiple definition of.weak.Z22json_hexadecimal_valuePKcmPm.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|478|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z20json_skip_whitespaceP18json_parse_state_s':| F:\demo\project\source\engine\middleware\json.h|499|multiple definition of.weak.Z20json_skip_whitespaceP18json_parse_state_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|499|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z26json_skip_c_style_commentsP18json_parse_state_s':| F:\demo\project\source\engine\middleware\json.h|545|multiple definition of.weak.Z26json_skip_c_style_commentsP18json_parse_state_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|545|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z24json_skip_all_skippablesP18json_parse_state_s':| F:\demo\project\source\engine\middleware\json.h|608|multiple definition of.weak.Z24json_skip_all_skippablesP18json_parse_state_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|608|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z20json_get_string_sizeP18json_parse_state_sj':| F:\demo\project\source\engine\middleware\json.h|659|multiple definition of.weak.Z20json_get_string_sizeP18json_parse_state_sj.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|659|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z26is_valid_unquoted_key_charc':| F:\demo\project\source\engine\middleware\json.h|840|multiple definition of.weak.Z26is_valid_unquoted_key_charc.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|840|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z17json_get_key_sizeP18json_parse_state_s':| F:\demo\project\source\engine\middleware\json.h|846|multiple definition of.weak.Z17json_get_key_sizeP18json_parse_state_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|846|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z20json_get_object_sizeP18json_parse_state_si':| F:\demo\project\source\engine\middleware\json.h|895|multiple definition of.weak.Z20json_get_object_sizeP18json_parse_state_si.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|895|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z19json_get_array_sizeP18json_parse_state_s':| F:\demo\project\source\engine\middleware\json.h|1031|multiple definition of.weak.Z19json_get_array_sizeP18json_parse_state_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|1031|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z20json_get_number_sizeP18json_parse_state_s':| F:\demo\project\source\engine\middleware\json.h|1104|multiple definition of.weak.Z20json_get_number_sizeP18json_parse_state_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|1104|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z19json_get_value_sizeP18json_parse_state_si':| F:\demo\project\source\engine\middleware\json.h|1303|multiple definition of.weak.Z19json_get_value_sizeP18json_parse_state_si.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|1303|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z17json_parse_stringP18json_parse_state_sP13json_string_s':| F:\demo\project\source\engine\middleware\json.h|1414|multiple definition of.weak.Z17json_parse_stringP18json_parse_state_sP13json_string_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|1414|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z14json_parse_keyP18json_parse_state_sP13json_string_s':| F:\demo\project\source\engine\middleware\json.h|1546|multiple definition of.weak.Z14json_parse_keyP18json_parse_state_sP13json_string_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|1546|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z17json_parse_objectP18json_parse_state_siP13json_object_s':| F:\demo\project\source\engine\middleware\json.h|1587|multiple definition of.weak.Z17json_parse_objectP18json_parse_state_siP13json_object_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|1587|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z16json_parse_arrayP18json_parse_state_sP12json_array_s':| F:\demo\project\source\engine\middleware\json.h|1724|multiple definition of.weak.Z16json_parse_arrayP18json_parse_state_sP12json_array_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|1724|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z17json_parse_numberP18json_parse_state_sP13json_number_s':| F:\demo\project\source\engine\middleware\json.h|1814|multiple definition of.weak.Z17json_parse_numberP18json_parse_state_sP13json_number_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|1814|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z16json_parse_valueP18json_parse_state_siP12json_value_s':| F:\demo\project\source\engine\middleware\json.h|1908|multiple definition of.weak.Z16json_parse_valueP18json_parse_state_siP12json_value_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|1908|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function json_parse_ex':| F:\demo\project\source\engine\middleware\json.h|2010|multiple definition of.weak._json_parse_ex.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|2010|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function json_parse':| F:\demo\project\source\engine\middleware\json.h|2119|multiple definition of.weak._json_parse.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|2119|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function json_extract_value':| F:\demo\project\source\engine\middleware\json.h|2129|multiple definition of.weak._json_extract_value.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|2129|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z28json_extract_get_number_sizePK13json_number_s':| F:\demo\project\source\engine\middleware\json.h|2145|multiple definition of.weak.Z28json_extract_get_number_sizePK13json_number_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|2145|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z28json_extract_get_string_sizePK13json_string_s':| F:\demo\project\source\engine\middleware\json.h|2153|multiple definition of.weak.Z28json_extract_get_string_sizePK13json_string_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|2153|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z28json_extract_get_object_sizePK13json_object_s':| F:\demo\project\source\engine\middleware\json.h|2161|multiple definition of.weak.Z28json_extract_get_object_sizePK13json_object_s.ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|2161|first defined here| obj\Debug\source\engine\SpritesheetParseJSON.o||In function Z27json_extract_get_array_sizePK12json_array_s':| F:\demo\project\source\engine\middleware\json.h|2189|multiple definition of.weak.Z27json_extract_get_array_sizePK12json_array_s.__ZNSt11char_traitsIcE6lengthEPKc'| obj\Debug\source\engine\EntityParseJSON.o:F:\demo\project\source\engine\ecs..\middleware\json.h|2189|first defined here|

sheredom commented 1 year ago

Ah are you using MinGW on Windows? It might be that I just don't support that, its not a tested codepath at least.

CBradDC commented 1 year ago

Correct. Would you have an idea what the time investment might be to add that as a path? I might be inclined to assist with this

sheredom commented 1 year ago

Honestly don't know what it would take to support it. Not sure if it is testable in GitHub actions for a starter (will go have a nosey).

CBradDC commented 1 year ago

Gotcha. Yeah all the errors seem to pertain to usage of char_traits, but not sure why that would be an issue. Thx for looking into this

sheredom commented 1 year ago

Don't want to add MinGW as a supported platform, nor add it to testing. Happy to accept patches that would make it work (you can see one of my other libraries has some MinGW support in it, but I don't officially support it https://github.com/sheredom/utest.h/blob/master/utest.h#L107).

CBradDC commented 1 year ago

Understood. After some contemplation I've decided I'll probably just write a wrapper around it, so there's only a solitary include. And ultimately I don't think we have need of JSON parsing in release builds, and/or may even ditch MinGW for MSVC in the end. Will have a look at the project you linked though. Thx again