2016-09-23 8 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| 

探している間、私はStringComparison.hのヘッダに含まれる質問(strcasecmpとstrncasecmp)に2つの関数は、実際にstring.hで宣言されていることが判明しました。私はまた、strings.h、彼らが元々属しているファイルを取得することができましたが、それも問題を解決しませんでした。

このサイトを検索しているうちに、この問題で苦労しているのは私だけではないことがわかりました。私が見つけた別の解決策は、関数がわずかに異なる名前を持つかもしれないので、defineステートメントを使うことを示唆しましたが、それはどちらも役に立たなかった。

+1

C関数。 – juanchopanza

+0

あなたのコードに '#include 'が含まれていますか? –

+0

おそらく、これらの文字列関数を持つMysysヘッダーがあります。 mingw32環境には、これらのPOSIX関数がありません。 –

答えて

1

私はちょうどこれと同じ問題が発生し、この質問が解決のために、Googleの検索中に思い付いたので、私はここに私の危険なソリューション文書化します:私はそれが複数にすることによってちょうど行くしまった最後に

をAssimpソースコードの小さな編集。文字列の問題を解決するだけでは、ビルドの後半で失敗するため、動作させるには不十分です。私は下で行った編集をリストアップします。私はそれらを一度に1つずつ作成してから再構築することをお勧めします。何らかの理由でセットアップが必要な場合は、そのうちのいくつかは必要ありません。リンクエラーを修正する別の方法を見つけ出す必要がある場合は、Exporter.cppへの最後の編集のために、このソリューションでモデルをエクスポートすることはできません。

これはクリーンな解決策ではなく、おそらく将来のバージョンのAssimpに置き換えられます。その時点で、私はそれを削除します。これはMinGWので構築された、assimp-3.3.1用です:

StringComparison.hで

、の#ifdefのelse句以外のすべてをコメントアウト、ASSIMP_stricmp機能を編集します。

/*#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にあります。

次に、::_fullpathについてのエラーをDefaultIOSystem.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のは、未定義であることについて文句を言います。 snprintfの前にアンダースコアを追加するには、次の#defineを変更するStringUtils.hを編集します。

# define ai_snprintf _snprintf 

atof定義されていないについて::エラーもあります。あなたは、私はほとんどすべて無効になっているので(これが原因私の特定のcmakeののsetttingsにあるかもしれない。これは、それが建物を取得する必要がありますがExporter.cppにリンクエラーが発生しますStringUtils.h

#include <cstdlib> 

を追加することによってこの問題を解決することができますモデルフォーマット)。私はgExportersの定義をコメントアウトし、これでそれを置き換えることによって、それを修正:

Exporter::ExportFormatEntry* gExporters = 0; 

この後それが構築され、罰金走りました。ライブラリファイルはcodeフォルダに置かれます。あなたのlibビルドパスとlibassimpにlibassimp.dll.aを置きます。実行可能ファイルのパスにあるdll。

もちろん、VisualStudioを代わりに使ってもいいです(私はそれをインストールするのが面倒だったからではありませんでした)か、Linuxでビルドしていました(以前これを行いました。私はWindowsポートを行う必要があった)。

0

私もいくつか問題がありましたが、うまくいけば解決できました。私はこれがおそらく特に遅くなることは知っていますが、私はインターネット上の誰かがこれを役に立つと願っています。 gcc 5.3.0を使ってCode :: Blocks 16.01を使ってコンパイルします。

::このスコープで宣言されていないstrncasecmp:

あなたはこのスコープで宣言されていない "::"

:: _フルパス含めると、削除する必要があります。

Iを完全なパスを見つける操作を実行する必要はありませんでしたので、これは私が一番確実なものです。しかし、とにかく、私はすべてを単に取り除くことができなかったので、私は代わりを見つけなければなりませんでした。つまり、 "GetFullPathName"を使用します。 MSDNの示唆どおり、、、、、。 私も行置き換える:正常に動作する必要があります ret = (char*)GetFullPathName(in, PATHLIMIT, _out, NULL);

によって ret = _fullpath(_out, in, PATHLIMIT); を、フルパスが取得され、エラーチェックがあまりにも保たれています。

vsnprintfは

ちょうど、関数名の前にアンダースコア_を追加し、このスコープで宣言されていません。

to_stringには、STDのメンバーではありません::

私は、これは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を持って、重要ではありません。彼らは標準ではありませんので、彼らは、標準のCヘッダ `string.h`ではありません)

関連する問題