【问题标题】:Compile Poco with MinGW on Windows在 Windows 上使用 MinGW 编译 Poco
【发布时间】:2013-01-16 06:19:33
【问题描述】:

我需要使用 MinGW 编译 poco,以便我可以在 Qt Creator 中使用它,但不知道如何使用,我已经设法在 Visual Studio 中编译 poco,但我无法在 Qt Creator 中使用这些库。

【问题讨论】:

  • 请注意,您也可以在 qt creator 中使用 msvc(带有用于 MSVC 的 Qt)。我会走那条路。

标签: qt mingw poco-libraries


【解决方案1】:

在这种环境下:

  • MinGW (GCC 4.7.0) + MSYS
  • Poco 1.4.6(2013 年 2 月 5 日下载)

这就是我为 MinGW 和 Windows 7 配置和编译 Poco 的方式:

  1. 将 Poco 解压到您选择的文件夹中。 C:/ 对于这个例子。
  2. 应用下一个路径以避免 copysign 错误。(来自https://github.com/pocoproject/poco/issues/57)。

    在文件 C:\poco-1.4.6\Foundation\include\Poco\FPEnvironment_DUMMY.h 中

    在这个方法中删除字符串std::

    inline float FPEnvironmentImpl::copySignImpl(float target, float source)
    {
    #if defined(__APPLE__) || defined(POCO_ANDROID)
        return copysignf(target, source);
    #else
        return /*std::*/copysignf(target, source);
    #endif
    }
    

    这里也是:

    inline double FPEnvironmentImpl::copySignImpl(double target, double source)
    {
    #if defined(__APPLE__) || defined(POCO_ANDROID)
        return copysign(target, source);
    #else
        return /*std::*/copysign(target, source);
    #endif
    }
    
  3. 在 C:\poco-1.4.6\build\config\MinGW 修改 MinGW 配置。 (来自http://cidebycide.blogspot.com.es/2012/06/building-poco-c-witn-mingw.html

    你应该删除 -mno-cygwin 字符串:

    SHLIB   = $(CXX) -shared -mno-cygwin -o $@ -Wl,--out-implib=$(dir $@)$(subst cyg,lib,$(basename $(notdir $@))).a
    

    SYSFLAGS = -mno-cygwin -D_WIN32 -DMINGW32 -DWINVER=0x500 -DPOCO_NO_FPENVIRONMENT -DPCRE_STATIC -DPOCO_THREAD_STACK_SIZE -DFoundation_Config_INCLUDED -I/usr/local/include -I/usr/include
    

    如果您不需要使用加密和 SSL,则应删除 SYSLIBS 行中的选项 -lssl-lcrypto

  4. 在没有演示、SSL、加密和 ODBC 支持的情况下编译 Poco:

    $ ./configure --omit=NetSSL_OpenSSL,Crypto,Data/ODBC,Data/MySQL --prefix=./_INSTALL
    $ make clean
    $ make -j4 -nodemos
    $ make install
    

祝你好运!

【讨论】:

  • 谢谢。我编译了它,但是如何在 Qt Creator 中使用 .a 库?
  • 我不知道如何使用 Qt 创建器,因为我通常使用 Eclipse,但我想您应该配置您的链接器库(-lPocoFoundation、-lPocoNet 等)并制作#includes您的代码中的 Poco 库。确保你的项目知道你的 .h 头文件和 .a 库在哪里,然后尝试一下
【解决方案2】:

补充 Cesar 的回答(在这里,为了格式化,而不是添加评论),您需要在您的 .pro 文件中添加类似的内容:

INCLUDEPATH += "<path_to_poco_include_dir>"
LIBS += -L"<path_to_poco_lib_dir>" -l<poco_lib> -l<poco_lib>

例如,在我的情况下,我会拥有这个(用于调试构建):

INCLUDEPATH += "C:/Dev/lib/poco/poco143/Debug/include"
LIBS += -L"C:/Dev/lib/poco/poco143/lib" -lPocoFoundationd -lPocoUtild

然后您可以通过为调试和发布版本创建设置来稍微改进一下:

LIB_HOME = "C:/Dev/lib/"
POCO_HOME = $${LIB_HOME}poco/poco143/

# SEE http://www.qtcentre.org/threads/23655-Does-Qt-Creator-understand-debug-release-scopes-in-pro-files
# OR http://www.qtcentre.org/threads/30430-How-to-set-pro-file-about-debug-and-release
####
CONFIG(debug, debug|release) {
CONFIG -= debug release
CONFIG += debug
}

CONFIG(release, debug|release) {
CONFIG -= debug release
CONFIG += release
}
####

debug {
POCO_DEBUG = d
POCO_PATH = $${POCO_HOME}Debug
}

release {
POCO_DEBUG =
POCO_PATH = $${POCO_HOME}Release
}

INCLUDEPATH += "$${POCO_PATH}/include"
LIBS += -L"$${POCO_PATH}/lib" -lPocoFoundation$${POCO_DEBUG} -lPocoUtil$${POCO_DEBUG}

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    使用 MinGW 构建 POCO 应该没什么大不了的,它在过去已经完成,但核心开发人员没有动力(不是我们的“痒”),也没有人抱怨拥有和维护 MinGW 构建;我们非常欢迎有人担任这个角色。有兴趣的可以联系我。

    【讨论】:

      【解决方案4】:

      MSYS2 package 提供安装当前(在撰写本文时)POCO C++ 库 1.9.0 所需的一切。

      • 要安装这个包,首先需要从msys2.org下载并安装MSYS2
      • 使用pacman(他们集成了Arch Linux 包管理器的一个端口),您可以识别要安装的POCO C++ 包:pacman -Ss poco 为您提供poco 的包列表是名称的一部分。这可能如下所示:
      $ pacman -Ss poco
      mingw32/mingw-w64-i686-poco 1.9.0-1
          POrtable COmponents C++ Libraries (mingw-w64)
      mingw64/mingw-w64-x86_64-poco 1.9.0-1
          POrtable COmponents C++ Libraries (mingw-w64)
      
      • 我想安装名为 mingw64/mingw-w64-x86_64-poco 的 64 位软件包,因此使用 pacman 安装它:
      $ pacman -S mingw64/mingw-w64-x86_64-poco
      
      • 这会安装 POCO C++ 的预构建动态版本。在我的系统上,这些库位于 msys2 的安装目录中

        • C:\msys64\mingw64\bin(DLL 来了)
        • C:\msys64\mingw64\lib(.a 来了)

      【讨论】:

        【解决方案5】:

        可能有如下错误:

        strip: '/Learn/POCO/poco-1.4.6p2/lib/MinGW/ia32/libPocoFoundation.dll.exe': 没有这样的文件

        我们可以通过更改文件“build\rules\global”中的行来解决问题

        STRIPCMD = $(STRIP) $@$(BINEXT) 
        

        STRIPCMD = $(STRIP) $@$
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-29
          • 1970-01-01
          • 2020-11-22
          • 2021-04-14
          相关资源
          最近更新 更多