Ошибка при компиляции программы, использующей Assimp с MinGW в CLion

Я пытаюсь скомпилировать программу в CLion, которая использует библиотеку Assimp с помощью компилятора MinGW. При сборке проекта доходит до 77% и выдает следующую ошибку на файле "SMDLoader.cpp.obj":

C:\Dev\AssimpTest\cmake-build-debug\_deps\assimp-src\code\SMDLoader.cpp: In member function 'void Assimp::SMDImporter::GetAnimationFileList(const string&, Assimp::IOSystem*, std::vector<std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)':
C:\Dev\AssimpTest\cmake-build-debug\_deps\assimp-src\code\SMDLoader.cpp:579:47: error: 'strtok_s' was not declared in this scope
 tok1 = strtok_s(&buf[0], "\r\n", &context1);
                                           ^
_deps\assimp-build\code\CMakeFiles\assimp.dir\build.make:2246: recipe for target '_deps/assimp-build/code/CMakeFiles/assimp.dir/SMDLoader.cpp.obj' failed

Это файл CMakeLists.txt, который я использую:

cmake_minimum_required(VERSION 3.13)
project(AssimpTest)

set(CMAKE_CXX_STANDARD 11)

find_package(assimp 4.1.0 QUIET)

if (NOT assimp_FOUND)
include(FetchContent)

FetchContent_Declare(
        assimp
        URL https://github.com/assimp/assimp/archive/master.tar.gz
)

FetchContent_GetProperties(raylib)
if (NOT assimp_POPULATED)
    set(FETCHCONTENT_QUIET NO)
    FetchContent_Populate(assimp)

    set(CMAKE_BUILD_TYPE release CACHE STRING "" FORCE)
    set(ASSIMP_BUILD_TESTS OFF CACHE BOOL "" FORCE)

    add_subdirectory(${assimp_SOURCE_DIR} ${assimp_BINARY_DIR})

endif()

endif()

add_executable(AssimpTest main.cpp)
target_link_libraries(${PROJECT_NAME} assimp)

Вот основной файл, который я пытаюсь скомпилировать на всякий случай:

#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>

int main() {
    Assimp::Importer importer;

    const char* pFile = R"(C:\Dev\raycast\models\teapot.fbx)";

    const aiScene* scene = importer.ReadFile( pFile,
                                          aiProcess_CalcTangentSpace       |
                                          aiProcess_Triangulate            |
                                          aiProcess_JoinIdenticalVertices  |
                                          aiProcess_SortByPType);
    if( !scene)
    {
        printf(importer.GetErrorString());
        return -1;
    }
    printf("Num meshes: %i", scene->mNumMeshes);

    return 0;
}

Основная причина, по которой я пытаюсь использовать Assimp, заключается в том, чтобы импортировать модели .fbx в мою программу, поэтому, если есть какой-либо способ оптимизировать все эти настройки только для этого, это было бы действительно полезно! Информация, которую я нашел об использовании этой библиотеки с MinGW в Интернете, была очень скудной.

В любом случае спасибо за помощь заранее.


person Henrique de Lima    schedule 20.01.2019    source источник
comment
Возможный дубликат Почему gcc не реализовал функции _s?   -  person Mike Kinghan    schedule 30.01.2019


Ответы (3)


Если вам не нужен загрузчик SMD, вы можете просто отключить его. Перейдите в Файл -> Настройки -> Сборка, выполнение, развертывание -> CMake и вставьте «-DASSIMP_BUILD_SMD_LOADER=NO» (без «») в параметры CMake.

person Alex Gushchyn    schedule 28.01.2019

GCC не реализует функции _s. Решение состоит в том, чтобы изменить условие #indef в верхней части SMDloader.cpp, чтобы снова проверять _MSC_VER вместо _WIN32:

#ifndef _MSC_VER
#define strtok_s strtok_r
#endif
person matepal297    schedule 22.12.2019

Какую версию mingw и assimp вы используете? Mingw является частью цепочки сборки CI, которую мы используем для тестирования assimp-кода, и эта проблема больше не возникнет. Поэтому, если эта проблема связана с нашим текущим мастером, нам нужно ее исправить.

И какой информации вам не хватает при использовании mingw? Я постараюсь оптимизировать это.

Спасибо!

person KimKulling    schedule 23.12.2019