Передача filepath между структурными функциями в C ++ Редактировать: исправлена ​​ошибка LNK2019 - PullRequest
0 голосов
/ 19 мая 2018

Я использую библиотеку заголовков C ++ для загрузки stl-файлов, чтобы затем визуализировать их в примере сценария VR.По сути, я использую библиотеку parse_stl, которую я нашел GitHub.Библиотека включена в мой основной файл include.Этот файл обрабатывает несколько структур, таких как: TriangleSet (эта генерирует модели треугольников с их координатами и цветами) и Scene (которая использует TriangleSet и обрабатывает рендеринг).

Мне нужно вызватьфункция loadSTLModel из функции void в структуре Scene.loadSTLModel - это void в TriangleSet, который позже вызывает stl::parse_stl.Эта функция принимает имя файла как std::string (по-видимому), но дает мне ссылки на ошибки, которые я не могу понять.Библиотека работает хорошо, я тестировал ее раньше, и мне удалось использовать ее в похожем примере, но это было более сложно, и я не смог правильно передать аргумент в этом примере.Мне ясно, что ошибка связана с тем, как я передаю переменную filepath различным функциям, но я не знаю, как это исправить.

Вот код ошибки:

main.obj: ошибка LNK2019: неразрешенный внешний символ "struct stl :: stl_data __cdecl stl :: parse_stl (класс std :: basic_string, класс std :: allocator> const &)" (? Parse_stl @ stl @@ YA? AUstl_data@ 1 @ ABV? $ Basic_string @ DU? $ Char_traits @ D @ std @@ V? $ Allocator @ D @ 2 @@ std @@@ Z) ссылка на функцию "public: void __thiscall TriangleSet :: loadSTLModel (char const *), без знака int, struct DirectX :: XMFLOAT3, struct DirectX :: XMFLOAT3) "(? loadSTLModel @ TriangleSet @@ QAEXPBDIUXMFLOAT3 @ DirectX @@ 1 @ Z) * ​​1019 *

main.h

struct TriangleSet{
   ...
   void loadSTLModel(const char* filename, uint32_t color, XMFLOAT3 origin, XMFLOAT3 size) {

        XMFLOAT3 s = multXMFLOAT(size, XMFLOAT3(0.5,0.5,0.5));
        XMFLOAT3 o = origin;

        std::string stl_filename = filename;
        auto stlData = stl::parse_stl(stl_filename);
        ...
   }
   ...
}

struct Scene{
  ...

  void Init(){
     ...
     TriangleSet furniture;
        std::string FilePathName = "C:/sampleSTL.stl";
        XMFLOAT3 Origen = { 0.0f, 0.0f, 0.0f };
        XMFLOAT3 Escala = { 1.0f, 1.0f, 1.0f};
        furniture.loadSTLModel(FilePathName.c_str(),0xff383838, Origen,     Escala);
     ...

}

parse_stl.h

namespace stl {
    struct stl_data {
    std::string name;
    std::vector<triangle> triangles;

    stl_data(std::string namep) : name(namep) {}
  };

  stl_data parse_stl(const std::string& stl_path);
}

parse_stl.cpp

namespace stl {
    ...
    stl_data parse_stl(const std::string& stl_path) {
    std::ifstream stl_file(stl_path.c_str(), std::ios::in | std::ios::binary);
    if (!stl_file) {
      std::cout << "ERROR: COULD NOT READ FILE" << std::endl;
      assert(false);    
    }

    char header_info[80] = "";
    char n_triangles[4];
    stl_file.read(header_info, 80);
    ...
    ...

    return info;
  }

}

1 Ответ

0 голосов
/ 19 мая 2018

Мне удалось заставить это работать.Проблема заключалась в том, что компоновщик не искал функцию parse_stl внутри пространства имен stl в parse_stl.cpp.Хотя Visual Studio скомпилировал код в файле parse_stl.cpp и включил его в проект, по какой-то причине компоновщик не пытался использовать файл.

Так что мне удалось заставить его работать, переместив все пространство имен 'stl' в мой файл main.cpp, так что теперь компоновщик может правильно найти функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...