C :用于体系结构错误的经典未定义符号

C++: Classic undefined symbols for architecture error

本文关键字:经典 未定义 符号 错误 用于 体系结构      更新时间:2023-10-16

最近学习C ,我很难编译我的课程。我目前正在收到以下晦涩的模板错误:

Undefined symbols for architecture x86_64:
  "SmallWorld::AJV::validate(nlohmann::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::adl_serializer>*, nlohmann::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::adl_serializer>*)", referenced from:
      SmallWorld::Map::(anonymous namespace)::readMap(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in map.test.cpp.o
  "std::__1::function<unsigned long (SmallWorld::Map::Graph<SmallWorld::Region>)> SmallWorld::Map::algorithm::dfs<SmallWorld::Region>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<bool (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::set<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > > const&)> const&)", referenced from:
      creates_a_connected_graph_small_world_map_Test::TestBody() in map.test.cpp.o
  "SmallWorld::Region::Region(nlohmann::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::adl_serializer>)", referenced from:
      std::__1::shared_ptr<SmallWorld::Region> std::__1::shared_ptr<SmallWorld::Region>::make_shared<nlohmann::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::adl_serializer> const&>(nlohmann::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::adl_serializer> const&&&) in map.test.cpp.o
ld: symbol(s) not found for architecture x86_64

可以简化为:

Undefined symbols for architecture x86_64:
  "SmallWorld::AJV::validate(nlohmann::json*, nlohmann::json*)", referenced from:
      SmallWorld::Map::(anonymous namespace)::readMap(string const&, string const&) in map.test.cpp.o
  "std::function<size_t(Graph<Region>)> SmallWorld::Map::algorithm::dfs<SmallWorld::Region>(string const&, std::function<bool (string const&, std::set<string> const&, std::unordered_map<string, string> const&)", referenced from:
      creates_a_connected_graph_small_world_map_Test::TestBody() in map.test.cpp.o
  "SmallWorld::Region::Region(nlohmann::json)", referenced from:
      std::shared_ptr<SmallWorld::Region> std::shared_ptr<SmallWorld::Region>::make_shared<nlohmann::json const&&&) in map.test.cpp.o
ld: symbol(s) not found for architecture x86_64

对我来说,这似乎是在说 bool AJV::validate(json* schema, json* data)在类型AJV上不存在。但是,我已经验证了常见错误(与实施不同的指示不同的实施情况不同(,无用。

这是AJV类的定义和实现:

// AJV.h
#ifndef SMALLWORLD_AJV_H
#define SMALLWORLD_AJV_H
#include <nlohmann/json.hpp>
using nlohmann::json;
namespace SmallWorld {
  class AJV {
  public:
    std::function<bool(json*)> compile(json* schema);
    bool validate(json* schema, json* data);
    json errors;
  private:
    json m_schema;
    std::function<bool(json*)> m_validator;
  };
};
#endif // SMALLWORLD_AJV_H
// AJV.cpp
#include <nlohmann/json.hpp>
#include "AJV.h"
using nlohmann::json;
namespace SmallWorld {
  std::function<bool(json*)> AJV::compile(json* schema) {
    return [](json* data){ return true; };
  };
  bool AJV::validate(json* schema, json* data){ return true; };
};

这是调用:

//loader.cpp
json* readMap(const string& map_path, const string& schema_path) {
        AJV ajv;
        json* schema = readJSONFile(schema_path);
        json* jmap = readJSONFile(map_path);
        if(ajv.validate(schema, jmap)){
          delete schema;
          return jmap;
        }else{
          delete schema;
          throw ajv.errors;
        }
      };

设置:

  • OS: MacOS 10.13.3
  • C 版本: 14
  • 编译器: g =>苹果LLVM版本9.0.0(Clang-900.0.39.2(
  • 构建管理器: cmake 3.5.1
  • IDE: w/linter-clang for linting(不是真正的IDE XD(

其他详细信息

编译是通过命令行完成的:mkdirp build && cd build && cmake .. && make

文件ajv.h在指定的源树中,包括路径。

我该如何解决这个问题?

欢呼☀️

在CMAKE中注册项目时,您列出了标题和源文件。然后,它将适用于您告诉使用的各自的IDE/构建系统的最佳选择。

如果您始终有一个标头和一个CPP文件(无需;您可能会发现某些对象复杂/大,以至于您想将其拆分为多个CPP文件以进行理智(,那么您可以列出所有文件cmake中没有扩展名的名称,并将.cxx和.h附加到您的结尾。这将使您只有一半的打字。

作为替代方案,有一条非弹力的路由可以使用文件命令来扫描文件的目录 - 但这仅在运行cmake时才完成;因此,不会自动更新;可以让一个源树在一个系统上构建良好;虽然不在另一个。