【问题标题】:Error when compiling a program that uses Assimp with MinGW in CLion在 CLion 中编译使用 Assimp 和 MinGW 的程序时出错
【发布时间】:2019-06-14 07:23:23
【问题描述】:

我正在尝试使用 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 模型导入我的程序,所以如果有任何方法可以优化所有这些设置,那将非常有帮助! 我在网上找到的有关 MinGW 使用这个库的信息非常稀少。

无论如何,提前感谢您的帮助。

【问题讨论】:

标签: cmake mingw clion assimp


【解决方案1】:

如果您不需要 SMD 加载器,您可以简单地禁用它。转到文件 -> 设置 -> 构建、执行、部署 -> CMake 并在 CMake 选项中插入“-DASSIMP_BUILD_SMD_LOADER=NO”(不带“”)

【讨论】:

    【解决方案2】:

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

    #ifndef _MSC_VER
    #define strtok_s strtok_r
    #endif
    

    【讨论】:

      【解决方案3】:

      您使用哪个 mingw 和 assimp 版本? Mingw 是我们用来测试 assimp 代码的 CI 构建链的一部分,这个问题将不再发生。所以如果这个问题是在我们当前的主人身上,我们需要修复它。

      在使用 mingw 时你会漏掉哪些信息?我会尽量优化这个。

      谢谢!

      【讨论】:

        猜你喜欢
        • 2019-05-31
        • 1970-01-01
        • 2014-11-02
        • 2011-11-07
        • 2015-07-05
        • 1970-01-01
        • 1970-01-01
        • 2015-01-03
        • 1970-01-01
        相关资源
        最近更新 更多