2016-09-23 136 views
3

我想在Code :: Blocks中使用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)是在string.h宣佈這一事實是包含在StringComparison.h頭。我也設法得到strings.h,這是他們最初屬於的文件,但包括那也沒有解決問題。

在搜索本網站時,我發現我並不是唯一一個在這個問題上掙扎的人。我發現的另一個解決方案建議使用define語句,因爲這些函數的名稱可能略有不同,但這也沒有幫助。

+1

他們不是在標準C頭'string.h',因爲它們不是標準C功能。 – juanchopanza

+0

您確定,您在代碼中包含了「#include 」。 –

+0

您可能正在查看具有這些字符串函數的Msys頭文件。 mingw32環境沒有這些POSIX函數。 –

回答

1

我正好遇到此完全相同的問題,以及谷歌搜索的解決方案在這個問題上來了,所以我會記錄我在這裏不可靠的解決方案:

在我得到了它通過使多會剛剛結束對Assimp源代碼的小編輯。解決字符串問題不足以讓它工作,因爲它在構建中稍後會失敗。我將列出我在下面所做的編輯。我建議一次製作一個,然後重新構建,以防出於某種原因與您的設置,其中一些不是必需的。請注意,如果您確實需要您必須找出解決鏈接錯誤的其他方法,則無法使用此解決方案進行模型導出,因爲上次編輯(至Exporter.cpp)。

這不是一個乾淨的解決方案,它可能會被未來版本的Assimp取代,在這一點上,我將刪除它。這是assimp-3.3.1,使用MinGW建:

在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 

做類似的事情在ASSIMP_strincmp

接下來,它拋出了一個關於::_fullpathDefaultIOSystem.cpp錯誤。我的「修復」,這只是使用註釋掉的一切其他在此功能的後備選項:

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是不確定的。編輯StringUtils.h更改以下的#define snprintf的前添加下劃線:

# define ai_snprintf _snprintf 

還有約:: ATOF沒有被定義的錯誤。您可以通過添加

#include <cstdlib> 

到StringUtils.h

解決這個問題這應該得到它的建設,但會有一個鏈接錯誤Exporter.cpp(這可能是由於我的特殊的CMake setttings因爲我禁用幾乎所有模型格式)。我固定它通過註釋掉的gExporters的定義以及與此替換它:

Exporter::ExportFormatEntry* gExporters = 0; 

此之後,它建立並運行良好。庫文件被放置在code文件夾中。將libassimp.dll.a放在lib構建路徑和libassimp中。在你的可執行文件的路徑中。當然,你也可以通過使用VisualStudio來代替它(我沒有,因爲我不能打擾它的安裝),或者通過在Linux上構建(我之前做過,它先構建好了,但是,我需要做一個Windows端口)。

0

我也有一些問題,但希望我能解決它們。我知道這可能已經太遲了,尤其是在幫助中,但我希望互聯網上的人會覺得這很有用。我使用gcc 5.3.0編譯Code :: Blocks 16.01。

:: strncasecmp不在此範圍內聲明:

你必須包括並刪除在此範圍內沒有宣佈 「::」

:: _ FULLPATH:

我從來不必執行查找完整路徑的操作,所以這個是我最不確定的一個。但無論如何,因爲我不能簡單地刪除所有的東西,所以我必須找到替代方案。也就是說,使用「GetFullPathName」。因此,正如MSDN所建議的那樣,我包括,,,,。 我也更換行: ret = _fullpath(_out, in, PATHLIMIT); 通過 ret = (char*)GetFullPathName(in, PATHLIMIT, _out, NULL);

應該可以正常工作,得到完整路徑和錯誤檢查保存得。

vsnprintf在此範圍內沒有聲明

只是在函數名稱前加上一個下劃線_

to_string不是性病的成員::

我會認爲這是使用的MinGW的一些bug,但實際上,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)