【问题标题】:enum not working with C++ using mingw compiler on Windows7枚举不能在 Windows7 上使用 mingw 编译器与 C++ 一起工作
【发布时间】:2012-11-09 09:35:38
【问题描述】:

我正在尝试使用 mingw 编译器在 Windows 上编译 libaws。在 libaws (https://sourceforge.net/projects/libaws/) 代码中,我试试这个:

C:/la/include/libaws/config.h:2:0: warning: "WIN32" redefined [enabled by default]
<built-in>:0:0: note: this is the location of the previous definition
In file included from C:/tools/libaws-0.9.2/src/canonizer.h:23:0,
                    from C:\tools\libaws-0.9.2\src\s3\s3connection.cpp:25:
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:62:9: error: expected identifier before '(' token
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:62:9: error: expected '}' before '(' token
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:62:9: error: expected unqualified-id before numeric constant
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:62:9: error: expected ')' before numeric constant
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:70:5: error: expected unqualified-id before 'public'
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:109:19: error: 'ActionType' was not declared in this scope
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:109:43: error: expected primary-expression before 'const'
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:110:19: error: expected primary-expression before 'const'
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:110:51: error: expected primary-expression before 'aExpiration'
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:129:5: error: expected unqualified-id before 'private'
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:135:51: error: 'ActionType' has not been declared
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:139:40: error: variable or field 'setRequestMethod' declared void
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:139:40: error: 'ActionType' was not declared in this scope
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:154:5: error: expected unqualified-id before 'public'
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:161:1: error: expected declaration before '}' token
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:143:7: warning: 'size_t aws::s3::getS3Data(void*, size_t, size_t, void*)' declared 'static' but never defined [-Wunused-function]
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:146:7: warning: 'size_t aws::s3::setCreateBucketData(void*, size_t, size_t, void*)' declared 'static' but never defined [-Wunused-function]
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:149:7: warning: 'size_t aws::s3::setPutData(void*, size_t, size_t, void*)' declared 'static' but never defined [-Wunused-function]
                    C:/tools/libaws-0.9.2/src/s3/s3connection.h:152:7: warning: 'size_t aws::s3::getHeaderData(void*, size_t, size_t, void*)' declared 'static' but never defined [-Wunused-function]
                    src\CMakeFiles\aws.dir\build.make:561: recipe for target 'src/CMakeFiles/aws.dir/s3/s3connection.cpp.obj' failed
                    mingw32-make[2]: *** [src/CMakeFiles/aws.dir/s3/s3connection.cpp.obj] Error 1
                    CMakeFiles\Makefile2:1006: recipe for target 'src/CMakeFiles/aws.dir/all' failed
                    mingw32-make[1]: *** [src/CMakeFiles/aws.dir/all] Error 2
                    Makefile:145: recipe for target 'all' failed
                    mingw32-make: *** [all] Error 2

                    C:\la>

发生的地方在一个班级里

class S3Connection {
    enum ActionType {
        // VALUES
    };
};

【问题讨论】:

  • 在以后的问题中,如果涉及到开源库中特定文件中的特定错误,请告知我们是否对库源进行了一些修改。

标签: c++ windows windows-7 mingw


【解决方案1】:

嗯,你显然在你的enum 中重新定义了WIN32WIN32 是在 Windows 平台上预定义的。

编辑: 您的日志中实际上有 2 个错误:

WIN32config.h 中重新定义,库实际上会指导您如何进行每个平台的配置:

// unset WIN32 for cygwin environment
#cmakedefine CYGWIN
#ifdef CYGWIN
#  undef WIN32
#endif

@MichaelBurr 回答中指出了第二个问题。

【讨论】:

  • 但是 cygwin 允许我生成用于 Visual Studio 的库吗?我以为它就像一个 Unix 文件系统?
  • Cygwin 是 Windows 中的 UNIX 模拟器。我想如果在其中运行,编译器将生成 UNIX 二进制文件。
【解决方案2】:

问题是s3connection.h 中的枚举名称之一与 Win32 SDK 中的宏名称冲突。在 Win32 中,DELETE 是用于处理 ACL(访问控制列表)的宏。处理这个问题的最好方法可能是:

#undef DELETE

在包含 Windows 标头之后和包含 libaws 标头之前的某个位置。

要么这样,要么修改枚举名称(以及可能使用它们的任何地方),以免发生冲突。

请记住,这表明libaws 可能没有直接在 Windows 目标上进行太多使用/测试,因此您可能需要支付更多费用才能成为先驱。使用 Cygwin 而不是 MinGW 可能会更好,因为看起来 libaws 至少在 Cygwin 平台上完成了一些工作。

【讨论】:

  • 但是 cygwin 允许我生成用于 Visual Studio 的库吗?我以为它就像一个 Unix 文件系统?
  • Cygwin 程序确实依赖 cygwin DLL 来提供 POSIX 仿真/支持。我实际上并没有使用 Cygwin,所以我不确定它是否可以生成 VS 可以使用的库。不过我敢打赌你可能是对的。
猜你喜欢
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2010-12-31
相关资源
最近更新 更多