在Windows和Linux上使用boost / asio在mingw中构建麻烦

时间:2017-09-21 08:34:13

标签: c++ boost mingw

我想做什么

我尝试使用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)就好了,但不知怎的,它看起来似乎并不能满足它的要求?

更新

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

  • 我把库放在调用的END处,在目标文件之后。
  • 我将-static改为-shared。

但我不确定这个DLL现在是否需要对目标系统进行提升?我的印象是 - 共享意味着升级库现在不包含在DLL中。

1 个答案:

答案 0 :(得分:0)

我得到了它的工作。方法如下:

让它构建

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

使其静止

现在问题出现了,我想要运行它的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环境。