2011-02-01 100 views
2

我必須在Windows上使用cgicc構建「概念驗證」。但目前我無法構建cgicc。當前版本的cgicc v3.2.9在MinGW(gcc v4.5.0/v3.4.5)和Cygwin(gcc v4.3.4-3)中都不會生成。gnu cgi(cgicc)不能在使用MinGW/Cygwin的Windows上使用gcc編譯

通過gcc v3.4.5及Automake在MinGW的我:

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.


使用GCC v4.3.4及Automake給出了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腳本。我設置了Eclipse的CDT使用apropriate編譯器開關(我也嘗試代碼::塊):

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

但同樣我:

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

CgiEnvironment.h:51〜53行中包含ifdef WIN32:

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

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

出了什麼問題?有什麼建議麼?

回答

1

現在我可以編譯cgicc了。感謝我的一位非常好的朋友弗拉德拉扎連科和一些小時的調查。但我必須做一些重大改變。

我的朋友幫助我正確理解主要問題。他和Vlad Lazarenko給了我一個調查__declspec()的好方向。這是Microsoft編譯器的一個功能,它是now supported in gcc

在調查過程中,我偶然發現一篇文章,內容爲migration hints for GCC3.4.3 to GCC4.1.2。讓我感動的聲明命名空間背後的模板的顯式實例在以下標題:

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

接下來,我發現了一個奇怪的現象,同時檢查對我的編譯環境,不同的編譯器開關和其他東西。在調查cgicc頭文件期間,定義的-DCGICC_EXPORTS有時不明確(擴展由Eclipse CDT顯示)。所以,我從改變CgiDefs.h

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

# define CGICC_API __declspec(dllimport) 

最後我改變了編譯器開關
-DWIN32 -DCGICC_EXPORTS -DHAVE_CONFIG_H -I.. -O0 -g3 -Wall -c -fmessage-length=0 -std=gnu++98。最重要的是-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在命令行中定義的宏應該會影響該宏,但它不會。 我的猜測是,一些標題處理它不包括在內。有關更多信息,請參閱thisthat

+0

這是在文件CgiDefs.h中完成的,它包含在受影響的類文件的頭文件中。順便說一下,如何使用代碼標籤將代碼添加到此文本框?

 ... #ifdef WIN32 // export library symbols # ifdef CGICC_EXPORTS # define CGICC_API __declspec(dllexport) # else # define CGICC_API __declspec(dllimport) # endif ... 
kirsche40 2011-02-01 21:29:22