零碎的:nlohmann json build error: LNK2019

描述

  • nlohmann 本身是 header-only 的方式,A 引入版本 3.11, B 引入版本 3.10;可能会导致 同时引入 A, B 的工程 C 出现混用版本的不兼容问题;
  • nlohmann 把 namespace 做成了带版本号的方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// player.h

class player : public std::enable_shared_from_this<player> {
public:
using uuid = std::uint64_t;
static constexpr uuid invalid_uuid = -1;

public:
player(uuid id) : _uuid(id) {}
~player() = default;

static std::shared_ptr<sz::player> create_player(player::uuid id,
const nlohmann::json &json_data);
};

// player.cpp

#include

std::shared_ptr<sz::player>
player::create_player(player::uuid id, const nlohmann::json &json_data) {
...
}
1
2
3
Severity	Code	Description	Project	File	Line	Suppression State
Error LNK2019 unresolved external symbol "public: static class std::shared_ptr<class sz::player> __cdecl sz::player::create_player(unsigned __int64,class nlohmann::json_abi_v3_11_2::basic_json<class std::map,class std::vector,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,bool,__int64,unsigned __int64,double,class std::allocator,struct nlohmann::json_abi_v3_11_2::adl_serializer,class std::vector<unsigned char,class std::allocator<unsigned char> >,void> const &)" (?create_player@player@sz@@SA?AV?$shared_ptr@Vplayer@sz@@@std@@_KAEBV?$basic_json@Vmap@std@@Vvector@2@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@_N_J_KNVallocator@2@Uadl_serializer@json_abi_v3_11_2@nlohmann@@V?$vector@EV?$allocator@E@std@@@2@X@json_abi_v3_11_2@nlohmann@@@Z) referenced in function "public: static class std::shared_ptr<class sz::battle::room> __cdecl sz::battle::room::create(class std::basic_string_view<char,struct std::char_traits<char> >,class std::basic_string_view<char,struct std::char_traits<char> >)" (?create@room@battle@sz@@SA?AV?$shared_ptr@Vroom@battle@sz@@@std@@V?$basic_string_view@DU?$char_traits@D@std@@@5@0@Z) game-service D:\sz_service\game-service\game-service\battle.obj 1

解决办法

  • 统一版本。
  • 例如当前项目引入了 behaviortree_cpp 4.6.1 (json 版本3.11.3)
  • 自己单独引入了 nlohmann/json (json 版本3.11.2)
  • 把自己引入的json也替换成 3.11.3 版本

当然如果可以只用一处json最好,但是这样会涉及改动引入第三方库的文件,具体使用哪种方式统一版本根据具体情况选择

参考资料

------ 本文结束 ------
------ 版权声明:转载请注明出处 ------