如何在 Makefile 中链接 boost 库?
Posted
技术标签:
【中文标题】如何在 Makefile 中链接 boost 库?【英文标题】:How to link boost library in Makefile? 【发布时间】:2019-03-08 15:14:41 【问题描述】:我是 Makefile 语法的新手,我不确定如何正确链接到 boost 库线程定义。
在 .cpp 文件中,我有以下代码:
boost::thread(&MessageBus::readBus, this, _bus).detach();
我已包括以下内容:
#include <boost/thread.hpp>
但在编译时出现以下错误,这似乎是由于链接问题:
../../../../bsl1/boost/boost/thread/detail/thread.hpp:255: undefined reference to `boost::thread::detach()'
Consolidator.o: In function `~thread_data':
../../../../bsl1/boost/boost/thread/detail/thread.hpp:93: undefined reference to `boost::detail::thread_data_base::~thread_data_base()'
../../../../bsl1/boost/boost/thread/detail/thread.hpp:93: undefined reference to `boost::detail::thread_data_base::~thread_data_base()'
Consolidator.o: In function `thread_data_base':
../../../../bsl1/boost/boost/thread/pthread/thread_data.hpp:144: undefined reference to `vtable for boost::detail::thread_data_base'
Consolidator.o: In function `thread_data':
../../../../external/bsl1/boost/boost/thread/detail/thread.hpp:111: undefined reference to `boost::detail::thread_data_base::~thread_data_base()'
Consolidator.o: In function `boost::thread::start_thread()':
../../../../bsl1/boost/boost/thread/detail/thread.hpp:180: undefined reference to `boost::thread::start_thread_noexcept()'
在 Makefile 中,我在 CFLAGS 和 CXXFLAGS 中都添加了 boost lib:
PROG = msgbusd
NO_STRIP = yes
.PATH: \
$.CURDIR/server \
SRCS += \
main.cpp \
oc.cpp \
UdpReceiver.cpp \
$OTHER_SRCS \
$LIB_PROTOS_SRCS \
CXXFLAGS += \
-fpermissive \
-I$SRCTOP_EXTERNAL/bsl1/boost
CFLAGS += \
-DBOOST_SYSTEM_NO_DEPRECATED \
-fno-inline \
-I$.CURDIR/server \
-I$.CURDIR/lib/h \
-I. \
-I$SRCTOP_EXTERNAL/bsl1/boost
DPLIBS += \
$LIBXSLT \
$LIBISC \
$LIBBSDXML \
$LIBXML2 \
$LIBEVENT \
$LIBPTHREAD \
$LIBZ
.include <bsd.prog.mk>
我正在使用 FreeBSD 6 进行开发并拥有 gcc 4.2。
为了能够成功编译,我还需要做哪些其他更改?
已经通过 this 线程,并没有找到任何特定于 Makefile 和 Makefile 语法的内容以包含 boost 库
【问题讨论】:
boost::thread
是(少数)boost 库之一,它们不是仅标头,并且需要链接器的 -L/-l 规则。没有看到你的 Makefile 我不能说你是如何添加这些的,但看起来你需要修改 DPLIBS 以包含 -L/-l 规则来提升。顺便说一句,你为什么要使用boost::thread
?自 C++11(至今 8 年!)C++ 已内置线程。
What is an undefined reference/unresolved external symbol error and how do I fix it?的可能重复
***.com/questions/10029437/… 可用的 gcc 版本(用于构建基于 bsd6 构建的操作系统)似乎不支持 C++11。所以,必须使用boost::thread
。截至目前,我的 Makefile 不使用 -L/-l 语法,所以我不知道该怎么做......以及这些规则中包含什么......
@AlanBirtles,已经通过了该线程,并没有找到任何特定于 Makefile 和 Makefile 语法的内容以包含 boost 库。
因为除了-L$BoostPath -lboost_thread
,没有什么好说的了。
【参考方案1】:
这个问题是关于 FreeBSD Makefiles 基础设施的。如果您没有将项目作为 FreeBSD 的一部分来开发(我怀疑您这样做,因为 FreeBSD 6 是古老的),您真的不需要在bsd.prog.mk
周围闲逛。我建议使用现代构建系统来完成这项任务,例如 CMake。
但是,如果你真的需要使用普通的 BSD Makefile,你应该定义 LDFLAGS
变量并在那里传递 -lboost_thread
。
【讨论】:
实际上,我正在开发我的项目作为 FreeBSD 6 的一部分。我们需要支持这个操作系统,因为我们的一些产品运行的操作系统的基本操作系统是 FreeBSD 6。 但是您真的需要限制自己只使用基本系统组件(例如 make)吗?如果您切换到 CMake,它仍然是构建时依赖项。 顺便说一句,我在 Makefile 中添加了LDFLAGS += -lboost_thread
并收到此错误 ../../../bin/ld: cannot find -lboost_thread
你还需要-L/path/to/where/boost_thread_lirary/located
。以上是关于如何在 Makefile 中链接 boost 库?的主要内容,如果未能解决你的问题,请参考以下文章