gnu cgi (cgicc) 无法在 Windows 上使用 MinGW/Cygwin 与 gcc 一起编译

发布于 2024-10-15 11:43:59 字数 1501 浏览 4 评论 0 原文

我必须在 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中,位于toplev.c:2067 请提交完整的错误报告,并在适当的情况下提供经过预处理的源代码。


使用 gcc v4.3.4 和 automake 为 Cygwin 提供:

在 CgiEnvironment.cpp:36 包含的文件中: ../cgicc/CgiEnvironment.h:52: 错误:显式实例化 'class std::vector >'在名称空间“cgicc”中 它不包含名称空间“std”)

,对于 MinGW 中的 gcc v4.5.0:

../cgicc/CgiEnvironment.h:52:33:错误:“class std::vector”的显式实例化在名称空间“cgicc”中(不包含名称空间 'std')



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

-DHAVE_CONFIG_H -DWIN32 -I.. -Wall -W -学究式-g -DDLL_EXPORT -DPIC -DCGICC_EXPORTS

但我又得到了:

'class std::vector 的显式实例化>'在命名空间“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
...
}

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

I have to build a "proof of concept" using cgicc on Windows. But currently I am unable to build cgicc. The current release of cgicc v3.2.9 won't build neither in MinGW (gcc v4.5.0 / v3.4.5) nor Cygwin (gcc v4.3.4-3).

By using gcc v3.4.5 and automake in MinGW I got:

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.



Using gcc v4.3.4 and automake gives for 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')

and for gcc v4.5.0 in MinGW:

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



I tried to ignore the Automake and Autoconf scripts. I set up Eclipse-CDT for using the apropriate compiler switches (I also tried Code::Blocks):

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

But again I got:

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 to line 53 contains the ifdef WIN32:

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

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

What goes wrong? Any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

默嘫て 2024-10-22 11:43:59

现在我可以编译cgicc了。感谢我的一位好朋友弗拉德·拉扎连科(Vlad Lazarenko)和我几个小时的调查。但我必须做一些重大改变。

我的朋友通过理解主要问题帮助我走上正确的道路。他和 Vlad Lazarenko 为我研究 __declspec() 提供了很好的指导。这是 Microsoft 编译器的一项功能,现在 gcc 中支持

在调查过程中,我偶然发现了一篇包含 GCC3 迁移提示的帖子。 4.3 到 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. “隐式模板实例化和模糊模板的优点/缺点是什么?”
    链接”与“显式模板实例化”?

Now I can compile cgicc. Thanks to a very good friend of mine, Vlad Lazarenko and some hours of investigation. But I have to do some major changes.

My friend helped me to go on the right way by understanding the main issue. He and Vlad Lazarenko gave me a good direction to investigate the __declspec(). This is a feature of Microsoft compilers which are now supported in gcc.

During investigation I stumbled over a post with migration hints for GCC3.4.3 to GCC4.1.2. So I moved the explicit instantiation of the templates behind the declared namespace in following headers:

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

Next I discovered a strange behaviour while checking different compiler switches and other things regarding my build environment. During investigatiopn of cgicc header files the defined -DCGICC_EXPORTS becomes sometimes undefined (expansion is shown by Eclipse CDT). So I changed CgiDefs.h from:

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

to

#  define CGICC_API __declspec(dllimport)

At the end I changed the compiler switches to
-DWIN32 -DCGICC_EXPORTS -DHAVE_CONFIG_H -I.. -O0 -g3 -Wall -c -fmessage-length=0 -std=gnu++98. Most important is -std=gnu++98. Without gnu extensions __declspec() wont generate any symbols - even for a static library. I do not understand why I need that for a static library because the symbols should be in their object files which are packet into libcgicc.a.

Now some further questions:

  1. Do anyone know a mechanism how CGICC_EXPORTS can became undefined
    without
    #undef CGICC_EXPORTS and without -UCGICC_EXPORTS?
  2. Why I have to use gnu extensions? I thought the defaults are independend.
  3. Why do I have to use __declspec(dllexport) for a static library?
  4. Why it is not enough to use the object files of a static library? Let me ask the same
    in a different way: Why are no symbols found if I try to link object files of a static
    library?
  5. What is the advantage/disadvantage of "implicit template instantiation and vague
    linkage" versus "explicit template instantiation"?
樱花落人离去 2024-10-22 11:43:59

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

The CGICC_API should be either defined as __declspec(dllimport) or __declspec(dllexport).
It looks like that DLL_EXPORT macro that gets defined in command line should affect that, but it doesn't.
My guess is that some header handling it is not included. See this and that for more information.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文