【问题标题】:Trouble building using boost/asio in mingw, both on windows and on linux在 windows 和 linux 上使用 mingw 中的 boost/asio 构建时出现问题
【发布时间】:2017-09-21 08:34:13
【问题描述】:

我想要做什么

我正在尝试使用 boost/asio 在 ARM 开发板和 PC 之间建立简单的通信。我想将 PC 端构建为 32 位 DLL,因为使用它的工具只有 32 位。
现在我正试图让构建工作,所以我的文件实际上并不包含太多代码,而是导入相关的库。最终我想在 linux 上构建,所以我在那里使用 mingw-w64 从源代码编译了 boost。但是,现在我正试图让它在 Windows 上构建,使用 msys2 和 mingw32。我安装了mingw32/mingw-w64-i686-boost 1.64.0-3 包。

目前我实际上还没有包含任何使用 boost 的代码,我只是在 pc/McBSP.cpp 中使用 #include <boost/asio.hpp> 导入它。

问题

当我试图编译它时,我得到了undefined reference to `boost::system::generic_category()' 错误,即使我在我的选项中包含了-lboost_system。

我正在 mingw32 shell 中构建,尝试构建的完整输出:

$ make pc32
g++ -m32 -DBUILDING_DLL -I board -I common -I pc -c -o common/Addresses-w64-i686.o common/Addresses.cpp
g++ -m32 -DBUILDING_DLL -I board -I common -I pc -c -o common/Audio_Preset-w64-i686.o common/Audio_Preset.cpp
SHA=fe69ff6
echo -n "static const char *GIT_COMMIT_TAG = \"fe69ff6\";" > common/version.h
g++ -m32 -DBUILDING_DLL -I board -I common -I pc -static -lwsock32 -lws2_32 -L/mingw32/lib -lboost_system-mt -c -o pc/McBSP_PC-w64-i686.o pc/McBSP_PC.cpp
g++ -m32 -DBUILDING_DLL -I board -I common -I pc -static -lwsock32 -lws2_32 -L/mingw32/lib -lboost_system-mt common/Addresses-w64-i686.o common/Audio_Preset-w64-i686.o \
    pc/McBSP_PC-w64-i686.o -o McBSP_PC-w64-i686.dll
pc/McBSP_PC-w64-i686.o:McBSP_PC.cpp:(.text+0xc4): undefined reference to `boost::system::generic_category()'
pc/McBSP_PC-w64-i686.o:McBSP_PC.cpp:(.text+0xce): undefined reference to `boost::system::generic_category()'
pc/McBSP_PC-w64-i686.o:McBSP_PC.cpp:(.text+0xd8): undefined reference to `boost::system::system_category()'
pc/McBSP_PC-w64-i686.o:McBSP_PC.cpp:(.text$_ZN5boost4asio5error19get_system_categoryEv[__ZN5boost4asio5error19get_system_categoryEv]+0x7): undefined reference to `boost::system::system_category()'
pc/McBSP_PC-w64-i686.o:McBSP_PC.cpp:(.text$_ZN5boost4asio6detail17winsock_init_base7startupERNS2_4dataEhh[__ZN5boost4asio6detail17winsock_init_base7startupERNS2_4dataEhh]+0x6a): undefined reference to `_imp__WSAStartup@8'
pc/McBSP_PC-w64-i686.o:McBSP_PC.cpp:(.text$_ZN5boost4asio6detail17winsock_init_base7cleanupERNS2_4dataE[__ZN5boost4asio6detail17winsock_init_base7cleanupERNS2_4dataE]+0x30): undefined reference to `_imp__WSACleanup@0'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.2.0/../../../../i686-w64-mingw32/lib/../lib\libmingw32.a(lib32_libmingw32_a-crt0_c.o): In function `main':
C:/repo/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crt0_c.c:18: undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile:124: McBSP_PC-w64-i686.dll] Error 1

我在此发现的所有问题都建议包括 -lboost 或 -lboost_system,我已经有了。 LD 发现 boost_system(-mt) 很好,但不知何故,它似​​乎不满足依赖?

更新

我通过以下更改对其进行编译:

  • 我将库放在调用的末尾,在目标文件之后。
  • 我将 -static 更改为 -shared。

但我不确定这个 DLL 现在是否需要在目标系统上进行增强?我的印象是 -shared 意味着 boost lib 现在不包含在 dll 中。

【问题讨论】:

  • 你试过用 gcc 编译吗?
  • @MohamedEl 我刚刚尝试使用 gcc,同时还添加了 -lstdc++,但我遇到了很多错误,从 undefined reference to `__cxa_begin_catch' 开始。
  • 尝试将 librt 添加到您的库列表中?
  • @MohamedEl librt 它没有找到,但是有 librtm,但是添加它不会改变输出。

标签: c++ boost mingw


【解决方案1】:

我让它工作了。方法如下:

让它构建

我需要在目标文件之后移动链接器标志。这就是摆脱boost::system 错误所需要的一切。这引入了一个新错误,ld 找不到 WinMain。通过将 -static 更改为 -shared 解决了这个问题,因为我想构建一个没有 main 函数的共享库。

静态化

现在问题出现了,我想运行它的 PC 需要有我使用的库,所以我需要告诉链接器静态链接这些库。我通过这些链接器标志实现了这一点:

-static-libstdc++ -static-libgcc -Wl,-Bstatic,--whole-archive -lpthread \
    -Wl,--no-whole-archive -L/mingw32/lib -Wl,-Bstatic \
    -lboost_system-mt -lws2_32 -lwsock32

现在它可以在 Windows 上构建 DLL。现在通过将g++ 替换为i686-w64-mingw32-g++ 并将-L/mingw32/lib 更改为我安装交叉编译的boost lib 的路径,可以将此构建系统移植到我的linux 环境中。

【讨论】:

    猜你喜欢
    • 2016-03-27
    • 2020-10-02
    • 2021-09-10
    • 2012-06-06
    • 1970-01-01
    • 2011-05-27
    • 2020-01-15
    • 1970-01-01
    • 2019-05-25
    相关资源
    最近更新 更多