簡體   English   中英

C ++:架構錯誤的經典未定義符號

[英]C++: Classic undefined symbols for architecture error

最近學習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

在我看來,這似乎是在AJV類型上不存在方法bool AJV::validate(json* schema, json* data) 但是,我已經驗證了常見的錯誤(與標頭聲明不同的實現,與實現的不同調用),但沒有用。

這是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;
        }
      };

設定:

  • 作業系統: MacOS 10.13.3
  • C ++版本: 14
  • 編譯器: g ++ => Apple LLVM版本9.0.0(clang-900.0.39.2)
  • 生成經理: CMake 3.5.1
  • IDE:具有 linter-clang的Lint的Atom IDE(實際上不是IDE XD)

額外細節

編譯是通過命令行完成的: mkdirp build && cd build && cmake .. && make

文件AJV.h在源樹中的指定包含路徑中。

我怎么解決這個問題?

干杯☀️

在CMake中注冊項目時,您會同時列出標頭和源文件。 然后,它將針對您告訴它使用的各個IDE /構建系統,盡可能地處理這些問題。

如果您始終只有一個標頭和一個cpp文件(沒有要求;您可能會發現一些對象足夠復雜/大到您想將其拆分為多個cpp文件),則可以列出所有文件名而無需cmake中的擴展名,然后將.cxx和.h附加到末尾。 這將使您只剩下一半的打字時間。

作為替代方案,有一種不推薦的方法,即使用file命令掃描目錄中的文件-但這僅在運行cmake時才執行; 因此不會自動更新; 使在一個系統上構建良好的源樹成為可能; 而沒有另一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM