2016-09-23 17 views
3

코드 :: 블록에서 MinGW로 Assimp를 컴파일하려고하는데 다음 오류가 발생합니다.strncasecmp 및 strcasecmp가 선언되지 않았습니다.

\assimp-3.3.1\assimp-3.3.1\code\StringComparison.h||In function 'int Assimp::ASSIMP_stricmp(const char*, const char*)':| 
\assimp-3.3.1\assimp-3.3.1\code\StringComparison.h|144|error: '::strcasecmp' has not been declared| 
\assimp-3.3.1\assimp-3.3.1\code\StringComparison.h||In function 'int Assimp::ASSIMP_strincmp(const char*, const char*, unsigned int)':| 
\assimp-3.3.1\assimp-3.3.1\code\StringComparison.h|193|error: '::strncasecmp' has not been declared| 

나는 문제의 두 가지 기능 (strcasecmp 및 strncasecmp가) StringComparison.h의 헤더에 포함되어 string.h에 선언 된 사실에 있음을 발견 한 검색하는 동안. 나는 또한 strings.h, 원래 속한 파일을 얻을 수 있었지만 그 중 하나를 포함하여 문제를 해결하지 못했습니다.

이 사이트를 검색하는 동안 나는이 문제와 관련하여 고심하고있는 유일한 사람이 아니라는 사실을 알아 냈습니다. 필자가 발견 한 또 다른 해결책은 함수가 약간 다른 이름을 가질 수 있기 때문에 define 문을 사용하도록 제안했지만 그 역시 도움이되지 않았습니다.

+1

그들은 표준의 C 헤더'string.h'에없는) C 함수. – juanchopanza

+0

정말로 #include 을 코드에 포함 시켰습니까? –

+0

아마도 이러한 문자열 기능을 가진 Mys 헤더를보고있을 것입니다. mingw32 환경에는 이러한 POSIX 기능이 없습니다. –

답변

1

난 그냥이 동일한 문제가 발생하고,이 질문은 솔루션에 대한 Google 검색시에 와서, 그래서 여기 내 사기 솔루션을 문서화 것이다 : 나는 그것을 여러함으로써 단지 가고있어 결국

을 Assimp 소스 코드를 약간 수정했다. 문자열 문제를 해결하는 것은 나중에 빌드에서 실패하기 때문에 제대로 작동하지 않습니다. 나는 아래에 만든 편집 내용을 나열 할 것입니다. 한 번에 하나씩 작성한 다음 다시 작성하는 것이 좋으며, 설치에 대한 이유가 무엇이든간에 필요한 경우가 있습니다. 링크 오류를 수정하는 또 다른 방법을 찾아야 할 필요가있는 경우 Exporter.cpp에 대한 마지막 편집으로 인해이 솔루션으로 모델 내보내기를 수행 할 수 없습니다.

그것은 깨끗한 해결책이 아니며 Assimp의 차기 버전으로 대체 될 것입니다. 그 시점에서 나는 그것을 그냥 삭제할 것입니다. StringComparison.h에서

,의 ASSIMP_stricmp 기능을 편집 #ifdef와의 else 절 제외한 모든 주석 : 비슷한 일을 할

/*#if (defined _MSC_VER) 

    return ::_stricmp(s1,s2); 
#elif defined(__GNUC__) 

    return ::strcasecmp(s1,s2); 
#else*/ 
    char c1, c2; 
    do { 
     c1 = tolower(*s1++); 
     c2 = tolower(*s2++); 
    } 
    while (c1 && (c1 == c2)); 
    return c1 - c2; 
//#endif 

이는 MinGW로 구축 assimp-3.3.1위한 것입니다 ASSIMP_strincmp에 있습니다.

다음으로 ::_fullpath에 대한 오류는 DefaultIOSystem.cpp에 있습니다. 또한 현재 snprintf이 정의되지 않은 것에 대해 불만을

ai_assert(in && _out); 
// char* ret; 
//#if defined(_MSC_VER) || defined(__MINGW32__) 
// ret = ::_fullpath(_out, in, PATHLIMIT); 
//#else 
    // use realpath 
// ret = realpath(in, _out); 
//#endif 
// if(!ret) { 
     // preserve the input path, maybe someone else is able to fix 
     // the path before it is accessed (e.g. our file system filter) 
//  DefaultLogger::get()->warn("Invalid path: "+std::string(in)); 
     strcpy(_out,in); 
// } 

이에 대한 나의 "수정"단지 다른 모든이 기능의 대체 옵션을 주석으로 사용하는 것이 었습니다. 현재 snprintf 전에 밑줄을 추가하려면 다음 #DEFINE을 변경 StringUtils.h 편집 :

# define ai_snprintf _snprintf 

으로 atof 정의되지 대해 :: 오류도 있습니다. 당신이 그것을 구축 얻어야한다 StringUtils.h

#include <cstdlib> 

를 추가하여이 문제를 해결할 수 있지만 내가 거의 모두 사용할 수 있기 때문에 내 특정 CMake의 setttings에 (이 될 수 Exporter.cpp에서 링크 오류가있을 것입니다 모델 형식). 가 내장 된이 후

Exporter::ExportFormatEntry* gExporters = 0; 

을 미세 달렸다 : 나는 gExporters의 정의를 주석이로 대체하여 해결했습니다. 라이브러리 파일은 code 폴더에 있습니다. libassimp.dll.a를 lib 빌드 경로와 libassimp에 놓습니다.귀하의 실행 파일의 경로에 DLL을.

물론 VisualStudio를 사용하여 설치할 수도 있습니다. (설치하기가 쉽지 않았기 때문에) 또는 Linux로 구축했기 때문입니다. Windows 포트가 필요했습니다.)

0

나는 약간의 문제가 있었지만 잘하면 나는 그것을 풀 수 있었다. 나는 이것이 특히 도움이 되기에는 너무 늦었다는 것을 알고 있지만, 인터넷상의 누군가가 이것을 유용하게 생각하기를 바랍니다. gcc 5.3.0을 사용하여 Code :: Blocks 16.01을 사용하여 컴파일합니다.

::이 범위에서 선언하지 strncasecmp :

당신은이 범위에서 선언이 아닌 "::"

:: _ fullpath에 포함 제거해야합니다 :

I을 전체 경로를 찾는 작업을 수행 할 필요가 없었으므로이 작업은 내가 가장 확신하지 못하는 작업입니다. 하지만 어쨌든, 모든 것을 단순히 제거 할 수는 없었기 때문에 대안을 찾아야했습니다. 즉, "GetFullPathName"을 사용합니다. MSDN에서 제안한대로,,,,. 나는 또한 라인 교체 : 잘 작동합니다 ret = (char*)GetFullPathName(in, PATHLIMIT, _out, NULL);

에 의해 ret = _fullpath(_out, in, PATHLIMIT); 을, 전체 경로를 얻을 수 및 오류 검사가 너무 보관됩니다.

vsnprintf은

그냥 함수 이름 앞에 밑줄 _를 추가이 범위에서 선언되지 않았습니다.

to_string는 표준의 멤버 :: 아닌

나는이는 MinGW를 사용하는 일반적인 버그가 있음을 가질 것이지만, 실제로 Assimp가 std::to_string에 내장 된 대안이 포함되어 있습니다. std:: 부분 만 제거하면 굴러갑니다. std:: 만 제거하면 작동하지 않는 파일에 포함하십시오.

test\CMakeFiles\gtest.dir\build.make|109|recipe for target 'test/gtest/src/gtest-stamp/gtest-build' failed|?

그것은 당신이 이미 "코드"폴더에서 작업 .DLL이 중요하지 않습니다

그들은 표준이 아니기 때문에