我必须在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
...
}
出了什么问题?有什么建议吗?
答案 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
的数据包。
现在还有一些问题:
CGICC_EXPORTS
如何变得不明确的机制
没有#undef CGICC_EXPORTS
而没有-UCGICC_EXPORTS
?__declspec(dllexport)
作为静态库?答案 1 :(得分:0)