如何在 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 库?的主要内容,如果未能解决你的问题,请参考以下文章

将 Boost 库包含到标准 MinGW 路径中

在linux下写makefile时,如何链接一个静态库?

CMAKE 如何告诉 makefile 链接库?

Linux2.6 如何编写Makefile,使驱动程序能够编译链接静态库

使用 MingW 和 makefile 时如何链接库

如何防止我的makefile由于静态库而重新链接