【发布时间】: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,但是添加它不会改变输出。