[英]Linker Error When Using Boost.asio With MingW on windows 7
[英]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)很好,但是似乎不滿足於依賴嗎?
我將其編譯為以下更改:
但是我不確定此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.