在CLion中编译将Assimp与MinGW结合使用的程序时出错

时间:2019-01-20 20:56:43

标签: cmake mingw clion assimp

我正在尝试使用MinGW编译器在CLion中编译使用Assimp库的程序。在构建项目时,它最多可以达到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模型导入到我的程序中,因此,如果有为此目的优化所有设置的方法,那将非常有帮助! 我发现有关Internet上MinGW对该库的使用情况的信息确实很少。

无论如何都要感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

GCC没有实现_s函数。解决方案是更改SMDloader.cpp顶部的#indef条件,以再次检查_MSC_VER而不是_WIN32

#ifndef _MSC_VER
#define strtok_s strtok_r
#endif

答案 1 :(得分:0)

如果不需要SMD加载器,则只需禁用它即可。转到文件->设置->构建,执行,部署-> CMake,然后在CMake选项中插入“ -DASSIMP_BUILD_SMD_LOADER = NO”(不带““)

答案 2 :(得分:0)

您使用哪个mingw-和assimp-version? Mingw是我们用来测试assimp代码的CI-buildchain的一部分,这个问题不再发生。因此,如果我们当前的管理员遇到了此问题,则需要对其进行修复。

使用mingw时会丢失哪些信息?我将尝试对此进行优化。

谢谢!