簡體   English   中英

在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>導入了它。

問題

當我嘗試編譯它時,即使我在選項中包含了-lboost_system ,也得到了undefined reference to `boost::system::generic_category()'錯誤的undefined reference to `boost::system::generic_category()'

我在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中。

我知道了。 方法如下:

建立它

我所需要的目標文件 ,移動連接標志。 這就是擺脫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++i686-w64-mingw32-g++並將-L/mingw32/lib更改為我將交叉編譯的boost lib安裝到的路徑,可以將該構建系統移植到我的linux環境中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM