gnu cgi(cgicc)不使用MinGW / Cygwin在Windows上使用gcc编译

时间:2011-02-01 18:27:13

标签: gcc cgi cygwin mingw

我必须在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,我得到了:

HTMLAttributeList.cpp:51:内部编译器错误:在rest_of_handle_final中,atplev.c:2067 如果合适,请提交完整的错误报告和预处理的来源。


使用gcc v4.3.4和automake给出了Cygwin:

CgiEnvironment.cpp中包含的文件:36: ../cgicc/CgiEnvironment.h:52:错误:显式实例化'class std :: vector< cgicc :: HTTPCookie,std :: allocator< cgicc :: HTTPCookie> >”在命名空间'cgicc'中 它没有包含命名空间'std')

和MinGW中的gcc v4.5.0:

../ cgicc / CgiEnvironment.h:52:33:错误:'class std :: vector< cgicc :: HTTPCookie>'的显式实例化在命名空间'cgicc'中(不包含命名空间) 'STD')



我试图忽略Automake和Autoconf脚本。我设置了Eclipse-CDT以使用适当的编译器开关(我也尝试过Code :: Blocks):

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

但我又得到了:

'class std :: vector< cgicc :: HTTPCookie,std :: allocator< cgicc :: HTTPCookie>的显式实例化>”命名空间'cgicc'(不包含命名空间'std')CgiEnvironment.h / cgicc / cgicc第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
...
}

出了什么问题?有什么建议吗?

2 个答案:

答案 0 :(得分:1)

现在我可以编译cgicc了。感谢我的一位非常好的朋友,Vlad Lazarenko和几个小时的调查。但我必须做一些重大改变。

我的朋友通过了解主要问题帮助我走正确的道路。他和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. “隐式模板实例化和模糊性”的优点/缺点是什么? 链接“与”显式模板实例化“?

答案 1 :(得分:0)

CGICC_API应定义为__declspec(dllimport)__declspec(dllexport)。 看起来在命令行中定义的DLL_EXPORT宏应该影响它,但事实并非如此。 我的猜测是不包括处理它的一些标题。有关详细信息,请参阅thisthat