在 windows 和 linux 上都无法在 mingw 中使用 boost/asio 进行构建

Trouble building using boost/asio in mingw, both on windows and on linux

我想做什么

我正在尝试使用 boost/asio 在 ARM 开发板和 PC 之间建立简单的通信。我想将 PC 端构建为 32 位 DLL,因为将使用它的工具只有 32 位。
现在我正在尝试让构建工作,所以我的文件实际上不包含太多代码,而是导入相关的库。最终我想在 linux 上构建,所以我在那里使用 mingw-w64 从源代码编译了 boost。但是,现在我正在尝试使用 msys2 和 mingw32 让它在 windows 上构建。我安装了 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) 很好,但不知怎么的,它似乎不满足依赖关系?

更新

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

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

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

构建它

我需要在 目标文件之后 移动 linker 标志。这就是摆脱 boost::system 错误所需要的全部。这引入了一个新错误,ld 找不到 WinMain。这是通过将 -static 更改为 -shared 来解决的,因为我想构建一个没有主要功能的共享库。

静态化

现在问题出现了,我想要 运行 这个的 PC 需要有我使用的库,所以我需要告诉 linker link 那些静态的.我通过这些 linker 标志实现了这一目标:

-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 环境中。