2011-02-01 13 views
2

Windows上でcgiccを使用して「概念の証明」を構築する必要があります。しかし、現在私はcgiccを構築することができません。現在のcgicc v3.2.9のリリースは、MinGW(gcc v4.5.0/v3.4.5)やCygwin(gcc v4.3.4-3)では作成されません。 MinGWのでGCC v3.4.5とautomakeのを使用することによりgnu cgi(cgicc)がMinGW/Cygwinを使用してWindowsでgccとコンパイルしない

は、私が得た:GCC v4.3.4とautomakeのを使用して

HTMLAttributeList.cpp:51: internal compiler error: in rest_of_handle_final, at toplev.c:2067 Please submit a full bug report, with preprocessed source if appropriate.


はCygwin用に提供します:

In file included from CgiEnvironment.cpp:36: ../cgicc/CgiEnvironment.h:52: error: explicit instantiation of 'class std::vector<cgicc::HTTPCookie, std::allocator<cgicc::HTTPCookie> >' in namespace 'cgicc' which does not enclose namespace 'std')

とにおけるGCC v4.5.0のためにMinGWの:

../cgicc/CgiEnvironment.h:52:33: error: explicit instantiation of 'class std::vector<cgicc::HTTPCookie>' in namespace 'cgicc' (which does not enclose namespace 'std')



AutomakeとAutoconfスクリプトを無視しようとしました。含まれている53行目に51:CgiEnvironment.hを

explicit instantiation of 'class std::vector<cgicc::HTTPCookie, std::allocator<cgicc::HTTPCookie> >' in namespace 'cgicc' (which does not enclose namespace 'std') CgiEnvironment.h /cgicc/cgicc line 52

-DHAVE_CONFIG_H -DWIN32 -I.. -Wall -W -pedantic -g -DDLL_EXPORT -DPIC -DCGICC_EXPORTS

しかし、再び私が得た:私は(私もコード::ブロックを試してみました)良いと考えコンパイラスイッチを使用するためのEclipse CDTを設定しましたifdef WIN32:

#include <string> 
#include <vector> 
#include <cstdlib> 

namespace cgicc { 
... 
#ifdef WIN32 
    template class CGICC_API std::vector<HTTPCookie>; 
#endif 
... 
} 

何が問題になるのですか?助言がありますか?

答えて

1

今、私はcgiccをコンパイルできます。私の友人、Vlad Lazarenkoと数時間の調査のおかげで、しかし、私はいくつかの大きな変更を行う必要があります。

私の友人は、主な問題を理解することによって正しい方法をとることができました。彼とVlad Lazarenkoは私に__declspec()を調査する良い方向を与えました。これはnow supported in gccであるMicrosoftコンパイラの機能です。

調査中、私はmigration hints for GCC3.4.3 to GCC4.1.2で投稿を見つけました。だから私は、ヘッダーは次の宣言された名前空間の背後にあるテンプレートの明示的なインスタンスを移動:

Cgicc.h
CgiEnvironment.h
HTMLAttributeList.h
HTMLElementList.h

次の私のビルド環境に関するさまざまなコンパイラスイッチや他のものを確認しながら、私は奇妙な行動を発見しました。 cgiccヘッダーファイルの調査中に、定義された-DCGICC_EXPORTSが時折未定義になります(拡張はEclipse CDTによって示されます)。終わりに、私は
-DWIN32 -DCGICC_EXPORTS -DHAVE_CONFIG_H -I.. -O0 -g3 -Wall -c -fmessage-length=0 -std=gnu++98にコンパイラスイッチを変更し

# define CGICC_API __declspec(dllimport) 

// export library symbols 
#ifdef CGICC_EXPORTS 
# define CGICC_API __declspec(dllexport) 
#else 
# define CGICC_API __declspec(dllimport) 
#endif 

:だから私はからCgiDefs.hを変更しました。最も重要なのは-std=gnu++98です。 gnuの拡張子を持たない場合は、__declspec()は、静的ライブラリの場合でもシンボルを生成しません。私はなぜシンボルがlibcgicc.aにパケットであるオブジェクトファイルにあるべきであるので、私は静的ライブラリのためにそれが必要であるか分からない。

現在、いくつかのさらなる質問:

  1. 誰もがCGICC_EXPORTS#undef CGICC_EXPORTS
    なしと-UCGICC_EXPORTSなし 未定義になったことができる方法のメカニズムを知っていますか?
  2. なぜgnu拡張機能を使用する必要がありますか?私はデフォルトが独立していると思った。
  3. なぜ静的ライブラリに__declspec(dllexport)を使用する必要がありますか?
  4. 静的ライブラリのオブジェクトファイルを使用するだけでは不十分なのはなぜですか?別の方法で と同じ質問をしてみましょう:静的な ライブラリのオブジェクトファイルをリンクしようとすると、シンボルが見つからないのはなぜですか?
  5. "明示的テンプレートインスタンス化"と "明示テンプレートインスタンス化"のどちらの利点/欠点はありますか?
0

CGICC_APIは、__declspec(dllimport)または__declspec(dllexport)と定義する必要があります。 コマンドラインで定義されたDLL_EXPORTマクロがそれに影響するはずですが、そうではないようです。 私の推測では、それを扱ういくつかのヘッダーは含まれていないということです。詳細については、thisおよびthatを参照してください。

+0

これは、影響を受けるクラスファイルのヘッダーファイルに含まれるCgiDefs.hファイルで行われます。ちなみに、コードタグを使用してこのテキストボックスにコードを追加するにはどうすればよいですか?

 ... #ifdef WIN32 // export library symbols # ifdef CGICC_EXPORTS # define CGICC_API __declspec(dllexport) # else # define CGICC_API __declspec(dllimport) # endif ... 
kirsche40

関連する問題