未定义的引用`boost :: this_thread:

时间:2013-12-22 06:36:25

标签: g++ makefile

我正在尝试构建Doge硬币无头钱包(类似于bitcoind)它似乎是Boost导致错误,但我不知道如何解决它。

(Ubuntu 12.04)

当我执行“make -f makefile.unix USE_UPNP = - ”时,我收到此错误:

/bin/sh ../share/genbuild.sh obj/build.h
g++ -O2 -pthread -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter -g -DUSE_IPV6 -DBOOST_SPIRIT_THREADSAFE -I/root/dogecoin/src -I/root/dogecoin/src/obj -DHAVE_BUILD_INFO -fno-stack-protector -fstack-protector-all -Wstack-protector -D_FORTIFY_SOURCE=2  -o dogecoind obj/version.o obj/checkpoints.o obj/netbase.o obj/addrman.o obj/crypter.o obj/key.o obj/db.o obj/init.o obj/irc.o obj/keystore.o obj/main.o obj/net.o obj/protocol.o obj/bitcoinrpc.o obj/rpcdump.o obj/rpcnet.o obj/rpcrawtransaction.o obj/script.o obj/scrypt.o obj/sync.o obj/util.o obj/wallet.o obj/walletdb.o obj/noui.o -Wl,-z,relro -Wl,-z,now   -Wl,-Bdynamic -l boost_system -l boost_filesystem -l boost_program_options -l boost_thread -l db_cxx -l ssl -l crypto -Wl,-Bdynamic -l z -l dl -l pthread
obj/db.o: In function `CAddrDB::Write(CAddrMan const&)':
/root/dogecoin/src/db.cpp:764: undefined reference to `RenameOver(boost::filesystem3::path, boost::filesystem3::path)'
obj/init.o: In function `AppInit2()':
/root/dogecoin/src/init.cpp:450: undefined reference to `CreatePidFile(boost::filesystem3::path const&, int)'
obj/main.o: In function `operator/':
/usr/local/include/boost/filesystem/path.hpp:648: undefined reference to `boost::filesystem::path::operator/=(boost::filesystem::path const&)'
obj/main.o: In function `sleep':
/usr/local/include/boost/thread/pthread/thread_data.hpp:249: undefined reference to `boost::this_thread::hiden::sleep_until(timespec const&)'
obj/main.o: In function `space':
/usr/local/include/boost/filesystem/operations.hpp:520: undefined reference to `boost::filesystem::detail::space(boost::filesystem::path const&, boost::system::error_code*)'
obj/main.o: In function `sleep':
/usr/local/include/boost/thread/pthread/thread_data.hpp:249: undefined reference to `boost::this_thread::hiden::sleep_until(timespec const&)'
obj/main.o: In function `boost::thread::start_thread()':
/usr/local/include/boost/thread/detail/thread.hpp:180: undefined reference to `boost::thread::start_thread_noexcept()'
obj/bitcoinrpc.o: In function `sleep':
/usr/local/include/boost/thread/pthread/thread_data.hpp:249: undefined reference to `boost::this_thread::hiden::sleep_until(timespec const&)'
obj/bitcoinrpc.o: In function `boost::filesystem::path::has_root_directory() const':
/usr/local/include/boost/filesystem/path.hpp:444: undefined reference to `boost::filesystem::path::root_directory() const'
obj/bitcoinrpc.o: In function `operator/':
/usr/local/include/boost/filesystem/path.hpp:648: undefined reference to `boost::filesystem::path::operator/=(boost::filesystem::path const&)'
obj/bitcoinrpc.o: In function `exists':
/usr/local/include/boost/filesystem/operations.hpp:289: undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
obj/bitcoinrpc.o: In function `boost::filesystem::path::has_root_directory() const':
/usr/local/include/boost/filesystem/path.hpp:444: undefined reference to `boost::filesystem::path::root_directory() const'
obj/bitcoinrpc.o: In function `operator/':
/usr/local/include/boost/filesystem/path.hpp:648: undefined reference to `boost::filesystem::path::operator/=(boost::filesystem::path const&)'
obj/bitcoinrpc.o: In function `exists':
/usr/local/include/boost/filesystem/operations.hpp:289: undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
obj/bitcoinrpc.o: In function `call_once<void (*)()>':
/usr/local/include/boost/thread/pthread/once_atomic.hpp:145: undefined reference to `boost::thread_detail::enter_once_region(boost::once_flag&)'
/usr/local/include/boost/thread/pthread/once_atomic.hpp:157: undefined reference to `boost::thread_detail::commit_once_region(boost::once_flag&)'
/usr/local/include/boost/thread/pthread/once_atomic.hpp:153: undefined reference to `boost::thread_detail::rollback_once_region(boost::once_flag&)'
/usr/local/include/boost/thread/pthread/once_atomic.hpp:145: undefined reference to `boost::thread_detail::enter_once_region(boost::once_flag&)'
/usr/local/include/boost/thread/pthread/once_atomic.hpp:157: undefined reference to `boost::thread_detail::commit_once_region(boost::once_flag&)'
/usr/local/include/boost/thread/pthread/once_atomic.hpp:153: undefined reference to `boost::thread_detail::rollback_once_region(boost::once_flag&)'
obj/util.o: In function `operator/':
/usr/local/include/boost/filesystem/path.hpp:648: undefined reference to `boost::filesystem::path::operator/=(boost::filesystem::path const&)'
obj/util.o: In function `path<char*>':
/usr/local/include/boost/filesystem/path.hpp:139: undefined reference to `boost::filesystem::path::codecvt()'
obj/util.o: In function `system_complete':
/usr/local/include/boost/filesystem/operations.hpp:531: undefined reference to `boost::filesystem::detail::system_complete(boost::filesystem::path const&, boost::system::error_code*)'
obj/util.o: In function `is_directory':
/usr/local/include/boost/filesystem/operations.hpp:294: undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
obj/util.o: In function `create_directory':
/usr/local/include/boost/filesystem/operations.hpp:405: undefined reference to `boost::filesystem::detail::create_directory(boost::filesystem::path const&, boost::system::error_code*)'
obj/util.o: In function `GetDataDir(bool)':
/root/dogecoin/src/util.cpp:1029: undefined reference to `boost::filesystem::path::operator/=(char const*)'
obj/util.o: In function `operator/':
/usr/local/include/boost/filesystem/path.hpp:648: undefined reference to `boost::filesystem::path::operator/=(boost::filesystem::path const&)'
obj/util.o: In function `boost::filesystem::path::has_root_directory() const':
/usr/local/include/boost/filesystem/path.hpp:444: undefined reference to `boost::filesystem::path::root_directory() const'
obj/util.o: In function `operator/':
/usr/local/include/boost/filesystem/path.hpp:648: undefined reference to `boost::filesystem::path::operator/=(boost::filesystem::path const&)'
obj/util.o: In function `boost::filesystem::path::has_root_directory() const':
/usr/local/include/boost/filesystem/path.hpp:444: undefined reference to `boost::filesystem::path::root_directory() const'
obj/util.o: In function `operator/':
/usr/local/include/boost/filesystem/path.hpp:648: undefined reference to `boost::filesystem::path::operator/=(boost::filesystem::path const&)'
/usr/local/include/boost/filesystem/path.hpp:648: undefined reference to `boost::filesystem::path::operator/=(boost::filesystem::path const&)'
/usr/local/include/boost/filesystem/path.hpp:648: undefined reference to `boost::filesystem::path::operator/=(boost::filesystem::path const&)'
obj/walletdb.o: In function `sleep':
/usr/local/include/boost/thread/pthread/thread_data.hpp:249: undefined reference to `boost::this_thread::hiden::sleep_until(timespec const&)'
obj/walletdb.o: In function `operator/':
/usr/local/include/boost/filesystem/path.hpp:648: undefined reference to `boost::filesystem::path::operator/=(boost::filesystem::path const&)'
obj/walletdb.o: In function `is_directory':
/usr/local/include/boost/filesystem/operations.hpp:294: undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
obj/walletdb.o: In function `copy_file':
/usr/local/include/boost/filesystem/operations.hpp:381: undefined reference to `boost::filesystem::detail::copy_file(boost::filesystem::path const&, boost::filesystem::path const&, boost::filesystem::copy_option::enum_type, boost::system::error_code*)'
obj/walletdb.o: In function `sleep':
/usr/local/include/boost/thread/pthread/thread_data.hpp:249: undefined reference to `boost::this_thread::hiden::sleep_until(timespec const&)'
obj/walletdb.o: In function `operator/=<std::basic_string<char> >':
/usr/local/include/boost/filesystem/path.hpp:302: undefined reference to `boost::filesystem::path::codecvt()'
obj/walletdb.o: In function `boost::filesystem::path& boost::filesystem::path::append<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::codecvt<wchar_t, char, __mbstate_t> const&)':
/usr/local/include/boost/filesystem/path.hpp:707: undefined reference to `boost::filesystem::path::m_append_separator_if_needed()'
/usr/local/include/boost/filesystem/path.hpp:710: undefined reference to `boost::filesystem::path::m_erase_redundant_separator(unsigned long)'
collect2: ld returned 1 exit status
make: *** [dogecoind] Error 1

4 个答案:

答案 0 :(得分:5)

您需要链接这些boost库,即将-lboost_thread -lboost_filesystem -lboost_system添加到链接器命令行。

有关详细信息,请参阅Link Your Program to a Boost Library

答案 1 :(得分:1)

我遇到了同样的问题,使用了boost 1.55.0。

我在boost库上使用了nm,没有包含任何包含filesystem3的符号

我假设boost 1.55.0删除了filesystem3,可能只将其放入标题模板,但这只是猜测。我正在链接mongodbclient.a并且我不想从源代码重新编译mongo(需要大量的设置)

转向提升1.49.0解决了问题。这些库中包含了filesystem3。

答案 2 :(得分:0)

使用boost 1.62我遇到了同样的问题。

但是,在我的情况下,因为我在我的Ubuntu 16.04上安装了几个boost版本,所以将库和include目录指向正确的文件夹确实有帮助。

我为include文件夹和库文件夹创建了符号链接(通过boost安装自动完成):

  

/ usr / include / boost - &gt;的/ usr /本地/ boost_1_62_0 /升压

  

/usr/local/lib/libboost_thread.so - &gt; libboost_thread.so.1.62.0

答案 3 :(得分:0)

如果您确定链接器被赋予了-lboost_...标志(请参见Maxim Egorushkin's答案),但是您仍然遇到链接器错误,则需要检查其他几件事:

  1. 确保您链接的是正确版本的boost

如果您正在使用或已经在系统上使用多个版本的boost,则可能要针对的头文件和要针对的链接库之间存在版本差异。您将需要通过运行libboost_*.so来检查您的ls -l your_lib_path/lib/libboost_*.so符号链接所链接的版本。如果这些符号链接未指向所需的Boost版本,则可以修改链接。

您可能还想将boost安装在与其他库分开的唯一位置,以确保版本一致性。如果这样做,请确保将新路径 first 放在您的LD_LIBRARY_PATH中,并为GCC提供新的-I包含路径标记(也应放在第一位)。

  1. 检查您的预处理器定义

尤其是如果您使用的是Boost的定制版本,则在尝试构建和链接库时,将要确保使用正确的预处理器定义(-D标志)。例如,在标题boost/thread/pthread/header_data.hpp中:

#ifdef BOOST_THREAD_USES_CHRONO
#ifdef BOOST_THREAD_SLEEP_FOR_IS_STEADY

        inline
        void BOOST_SYMBOL_VISIBLE sleep_for(const chrono::nanoseconds& ns)
        {
            return boost::this_thread::hiden::sleep_for(boost::detail::to_timespec(ns));
        }
#endif
#endif // BOOST_THREAD_USES_CHRONO

如果库是在没有BOOST_THREAD_USES_CHRONO的情况下构建的,则功能void BOOST_SYMBOL_VISIBLE sleep_for(const chrono::nanoseconds& ns)将不在共享库中。如果要使用BOOST_THREAD_USES_CHRONO定义的 增强库进行构建,最终可能会出现链接器错误。