我正在尝试使用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对该库的使用情况的信息确实很少。
无论如何都要感谢您的帮助。
答案 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时会丢失哪些信息?我将尝试对此进行优化。
谢谢!