C++ 使用MinGW构建自适应通信环境(ACE)

C++ 使用MinGW构建自适应通信环境(ACE),c++,mingw32,ace,C++,Mingw32,Ace,我正在使用MinGW中的以下步骤构建自适应通信环境(ACE)6.4.2。我使用Windows10 64位操作系统。我对构建C++项目非常陌生。p> 我安装了明格。我相信它是一个32位版本。我使用MinGW安装管理器下载所有软件包 我从E:/dependencies/ACE-6.4.2下载了ACE 6.4.2,并将其解压缩到E:/dependencies/ACE-6.4.2 MinGW的根级文件夹结构如下所示。 我将E:/dependencies/MinGW/bin和E:/dependenci

我正在使用
MinGW
中的以下步骤构建自适应通信环境(ACE)6.4.2。我使用Windows10 64位操作系统。我对构建C++项目非常陌生。p> 我安装了明格。我相信它是一个32位版本。我使用MinGW安装管理器下载所有软件包

我从E:/dependencies/ACE-6.4.2下载了ACE 6.4.2,并将其解压缩到E:/dependencies/ACE-6.4.2

MinGW
的根级文件夹结构如下所示。

我将E:/dependencies/MinGW/bin和E:/dependencies/MinGW/msys/1.0/bin包含到系统变量
path

我执行了以下步骤:

  • 打开一个
    MSYS外壳
    。将
    PATH
    环境变量设置为MinGW的bin目录:

    export PATH=/e/dependencies/MinGW/bin:$PATH

  • 添加了指向ACE wrappers源树根的
    ACE_ROOT
    环境变量:

    export ACE_ROOT=/e/dependencies/ACE-6.4.2/ACE_wrappers

  • $ACE\u ROOT/ACE
    目录中创建了一个名为
    config.h
    的文件,该文件包含:
    #包括“ace/config-win32.h”

  • $ACE\u ROOT/include/makeinclude
    目录中创建了一个名为
    platform\u macros.GNU
    的文件,其中包含:

    include$(ACE\u ROOT)/include/makeinclude/platform\u mingw32.GNU
    INSTALL_PREFIX=/e/dependencies/ACE-6.4.2-INSTALL

  • MSYS
    shell中

    cd$ACE\u ROOT/ACE
    制造

  • 据我所知,将使用
    MinGW
    中的
    g++

    以及错误日志

    make[3]: Entering directory 'e:/dependencies/ACE-6.4.2/ACE_wrappers/ace'
    
    GNUmakefile: /e/dependencies/ACE-6.4.2/ACE_wrappers/ace/GNUmakefile.ACE MAKEFLAGS=w
    
    g++ -Wnon-virtual-dtor -O3 -g -mthreads -mtune=pentiumpro -fno-strict-aliasing -Wall -W -Wpointer-arith -pipe -DACE_HAS_CUSTOM_EXPORT_MACROS=0 -Wno-unknown-pragmas   -Ie:/dependencies/ACE-6.4.2/ACE_wrappers -DACE_NO_INLINE -I.. -DACE_BUILD_DLL  -c  -o .shobj/Local_Name_Space.o Local_Name_Space.cpp
    In file included from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/os_include/os_sched.h:25:0,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/OS_NS_Thread.h:30,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Thread_Mutex.h:29,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Log_Category.h:18,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Malloc.h:22,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Malloc_T.h:16,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Local_Name_Space.h:18,
                     from Local_Name_Space.cpp:1:
    e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/os_include/os_time.h:56:16: error: redefinition of 'struct timespec'
     typedef struct timespec
                    ^
    In file included from e:\dependencies\mingw\include\sys\time.h:3:0,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/os_include/sys/os_time.h:28,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/os_include/sys/os_resource.h:25,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/os_include/sys/os_wait.h:26,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/os_include/os_stdlib.h:27,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Basic_Types.h:54,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Log_Msg.h:26,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Log_Category.h:17,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Malloc.h:22,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Malloc_T.h:16,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Local_Name_Space.h:18,
                     from Local_Name_Space.cpp:1:
    e:\dependencies\mingw\include\time.h:102:8: error: previous definition of 'struct timespec'
     struct timespec
            ^
    In file included from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Local_Name_Space_T.cpp:15:0,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Local_Name_Space_T.h:259,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Local_Name_Space.h:126,
                     from Local_Name_Space.cpp:1:
    e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/OS_NS_unistd.h:322:45: warning: 'useconds_t' is deprecated [-Wdeprecated-declarations]
                          useconds_t interval = 0);
                                                 ^
    In file included from e:\dependencies\mingw\include\wchar.h:66:0,
                     from e:\dependencies\mingw\lib\gcc\mingw32\5.3.0\include\c++\cwchar:44,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/ace_wchar.h:43,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/config-lite.h:33,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/ACE_export.h:10,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Malloc.h:16,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Malloc_T.h:16,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Local_Name_Space.h:18,
                     from Local_Name_Space.cpp:1:
    e:\dependencies\mingw\include\sys\types.h:221:23: note: declared here
     typedef unsigned long useconds_t __MINGW_ATTRIB_DEPRECATED;
                           ^
    In file included from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Local_Name_Space_T.cpp:15:0,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Local_Name_Space_T.h:259,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Local_Name_Space.h:126,
                     from Local_Name_Space.cpp:1:
    e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/OS_NS_unistd.h:322:45: warning: 'useconds_t' is deprecated [-Wdeprecated-declarations]
                          useconds_t interval = 0);
                                                 ^
    e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/OS_NS_unistd.h:322:45: warning: 'useconds_t' is deprecated [-Wdeprecated-declarations]
    e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/OS_NS_unistd.h:326:78: warning: 'useconds_t' is deprecated [-Wdeprecated-declarations]
                          const ACE_Time_Value &tv_interval = ACE_Time_Value::zero);
                                                                                  ^
    In file included from e:\dependencies\mingw\include\wchar.h:66:0,
                     from e:\dependencies\mingw\lib\gcc\mingw32\5.3.0\include\c++\cwchar:44,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/ace_wchar.h:43,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/config-lite.h:33,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/ACE_export.h:10,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Malloc.h:16,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Malloc_T.h:16,
                     from e:/dependencies/ACE-6.4.2/ACE_wrappers/ace/Local_Name_Space.h:18,
                     from Local_Name_Space.cpp:1:
    e:\dependencies\mingw\include\sys\types.h:221:23: note: declared here
     typedef unsigned long useconds_t __MINGW_ATTRIB_DEPRECATED;
                           ^
    e:/dependencies/ACE-6.4.2/ACE_wrappers/include/makeinclude/rules.local.GNU:188: recipe for target '.shobj/Local_Name_Space.o' failed
    make[3]: *** [.shobj/Local_Name_Space.o] Error 1
    make[3]: Leaving directory 'e:/dependencies/ACE-6.4.2/ACE_wrappers/ace'
    GNUmakefile:45: recipe for target 'ACE' failed
    make: *** [ACE] Error 2
    

    最终,我必须使用QtCreator使用ACE进行应用程序开发。我只能找到32位版本的QT-build。这就是为什么我选择MinGW 32位来构建ACE。

    我在
    timespec
    重新定义时遇到了同样的问题。我正在使用
    tdm-gcc-5.1.0-3
    gitbash
    。在我的例子中,问题是
    timespec
    是在
    pthread.h
    ace/os\u include/os\u time.h
    中定义的。解决此问题的一种方法是编辑
    ace/config.h

    // Get 'timespec' explicitly from here. 
    #include <pthread.h>
    
    // Tell ACE to do not declare 'timespec'. 
    #define ACE_HAS_POSIX_TIME 1
    
    // Tell ACE to declare 'timespec_t' alias.
    #define ACE_LACKS_TIMESPEC_T 1
    
    // Default windows config, see ACE install manual.
    #include "ace/config-win32.h"
    
    如果没有帮助,请查看
    ace/os\u include/os\u time.h
    。您可能会发现特定的宏适合您的问题


    作为补充说明,我在使用
    tdm
    gitbash
    时遇到了链接错误。看起来很奇怪,我还不知道为什么会这样。比如说,

    对于
    ACE-6.3.2

    C:/TDM-GCC-32/bin/../lib/gcc/mingw32/5.1.0/../../../../mingw32/bin/ld.exe: cannot find .: Permission denied
    collect2.exe: error: ld returned 1 exit status
    
    对于
    ACE-6.4.0

    g++.exe: error: .shobj/Filecac: No such file or directory
    
    对于
    ACE-6.4.6

    g++.exe: error: .shobj/Co: No such file or directory
    

    mingw
    msys
    提供了成功的构建。

    我做了完全相同的事情,遇到了相同的错误。我知道这是一个开源软件。但是,该指令需要更新,或者至少指定用于生成的版本。添加
    config.h文件中的“#define ACE_HAS_POSIX_TIME 1”不会修复错误。结构timespec在mingw/include/time.h中定义。(我的g++.exe版本为6.3.0)。如果未定义ACE_HAS_POSIX_TIME,则$ACE_ROOT/ACE/os_include/os_TIME.h将再次尝试定义它,因此会出现错误

    在您的示例中,您可以按照错误消息进行操作:

    ace/os_include/os_time.h:56:16: error: redefinition of 'struct timespec'
     typedef struct timespec
    
    如果在该行打开文件,typedef将被一个#If defined XXX宏包围,从中可以看到需要定义或取消定义XXX。对于我的,类似的问题,例如,我必须通过以下方式修改我的config.h:

    #define ACE_HAS_POSIX_TIME 1
    #define ACE_LACKS_TIMESPEC_T 1
    
    #include "ace/config-win32.h"
    #undef ACE_LACKS_CLOCKID_T
    

    你可能需要自己仔细研究一下。你有很多从源代码编译C++代码的经验吗?您正在使用哪个版本的MingW和哪个版本的GCC?第二,您确定您正在报告第一个重大错误吗?您可能忽略了前面的错误,这可以解释第二个错误。调试生成日志中的第二个或第七十二个错误是毫无意义的。您可以将make的输出重定向到日志文件,并将其粘贴到pastebin,然后进行查看。请提供有关哪个ACE版本、哪个MinGW、您如何配置它等的详细信息。可能您有一个非常新的MinGW版本,
    g++--version
    的输出是什么?尝试将
    #define ACE_HAS_POSIX_TIME 1
    添加到ACE/config.h文件的顶部。
    g++--version
    outputs
    g++(x86_64-POSIX-sjlj,由strawberryperl.com项目构建)4.9.2
    TCPU=generic
    在platform\u macros.GNU中可能会有所帮助
    #define ACE_HAS_POSIX_TIME 1
    #define ACE_LACKS_TIMESPEC_T 1
    
    #include "ace/config-win32.h"
    #undef ACE_LACKS_CLOCKID_T