问题描述
当尝试使用以下配置命令编译比特币核心时,它不起作用。
EVENT_PTHREADS_CFLAGS='-I/usr/lib/i386-linux-gnu' EVENT_PTHREADS_LIBS='-L/usr/lib/i386-linux-gnu -levent' EVENT_CFLAGS='-I/usr/lib/i386-linux-gnu' EVENT_LIBS='-L/usr/lib/i386-linux-gnu -levent' CFLAGS='-I/usr/lib/i386-linux-gnu -levent -DBOOST_NO_CXX11_ScopED_ENUMS -O1 -m32 -g -latomic -lboost_system -lboost_filesystem -levent_core -lgcc_s --rtlib=compiler-rt' CXXFLAGS='-I/usr/lib/i386-linux-gnu -levent -DBOOST_NO_CXX11_ScopED_ENUMS -O1 -m32 -g -latomic -lboost_system -lboost_filesystem -levent_core -lgcc_s --rtlib=compiler-rt' ./configure --enable-static --disable-hardening --enable-util-cli --enable-util-tx --enable-util-wallet --with-libmultiprocess=no --with-incompatible-bdb --with-boost-libdir=/usr/lib/i386-linux-gnu
这里是错误
/usr/bin/ld: libbitcoin_server.a(libbitcoin_server_a-init.o): in function `directory_iterator':
/usr/local/include/boost/filesystem/directory.hpp:278: undefined reference to `boost::filesystem::detail::directory_iterator_construct(boost::filesystem::directory_iterator&,boost::filesystem::path const&,unsigned int,boost::system::error_code*)'
/usr/bin/ld: libbitcoin_server.a(libbitcoin_server_a-init.o): in function `boost::filesystem::directory_entry::status() const':
/usr/local/include/boost/filesystem/directory.hpp:132: undefined reference to `boost::filesystem::directory_entry::get_status(boost::system::error_code*) const'
/usr/bin/ld: libbitcoin_server.a(libbitcoin_server_a-blockchain.o): in function `boost::filesystem::absolute(boost::filesystem::path const&,boost::filesystem::path const&)':
/usr/local/include/boost/filesystem/operations.hpp:258: undefined reference to `boost::filesystem::detail::absolute(boost::filesystem::path const&,boost::system::error_code*)'
/usr/bin/ld: libbitcoin_server.a(libbitcoin_server_a-torcontrol.o): in function `StartTorControl(CService)':
/home/blank/bitcoin-0.21.0/src/torcontrol.cpp:753: undefined reference to `evthread_use_pthreads'
/usr/bin/ld: libbitcoin_server.a(libbitcoin_server_a-httpserver.o): in function `InitHTTPServer()':
/home/blank/bitcoin-0.21.0/src/httpserver.cpp:376: undefined reference to `evthread_use_pthreads'
/usr/bin/ld: libbitcoin_wallet.a(libbitcoin_wallet_a-walletutil.o): in function `recursive_directory_iterator':
/usr/local/include/boost/filesystem/directory.hpp:456: undefined reference to `boost::filesystem::detail::recursive_directory_iterator_construct(boost::filesystem::recursive_directory_iterator&,boost::system::error_code*)'
/usr/bin/ld: libbitcoin_wallet.a(libbitcoin_wallet_a-walletutil.o): in function `boost::filesystem::directory_entry::symlink_status() const':
/usr/local/include/boost/filesystem/directory.hpp:134: undefined reference to `boost::filesystem::directory_entry::get_symlink_status(boost::system::error_code*) const'
/usr/bin/ld: libbitcoin_wallet.a(libbitcoin_wallet_a-walletutil.o): in function `boost::filesystem::recursive_directory_iterator::increment(boost::system::error_code&)':
/usr/local/include/boost/filesystem/directory.hpp:500: undefined reference to `boost::filesystem::detail::recursive_directory_iterator_increment(boost::filesystem::recursive_directory_iterator&,boost::system::error_code*)'
/usr/bin/ld: libbitcoin_wallet.a(libbitcoin_wallet_a-bdb.o): in function `boost::filesystem::copy_file(boost::filesystem::path const&,boost::filesystem::copy_option::enum_type)':
/usr/local/include/boost/filesystem/operations.hpp:355: undefined reference to `boost::filesystem::detail::copy_file(boost::filesystem::path const&,boost::system::error_code*)'
我正在尝试在 Ubuntu 20.04 上编译 32 位版本的软件。我做了一些研究,当库不适合正确的架构时,可能会出现这个问题。我仔细检查并在 i386 标签下安装了所有库。我该如何解决这个问题?
解决方法
让它远程可读:
export EVENT_PTHREADS_CFLAGS='-I/usr/lib/i386-linux-gnu'
export EVENT_PTHREADS_LIBS='-L/usr/lib/i386-linux-gnu -levent'
export EVENT_CFLAGS='-I/usr/lib/i386-linux-gnu'
export EVENT_LIBS='-L/usr/lib/i386-linux-gnu;-levent'
export CFLAGS='-I/usr/lib/i386-linux-gnu
-DBOOST_NO_CXX11_SCOPED_ENUMS
-O1 -m32 -g -latomic
-levent -lboost_system -lboost_filesystem -levent_core -lgcc_s --rtlib=compiler-rt'
export CXXFLAGS='-I/usr/lib/i386-linux-gnu
-DBOOST_NO_CXX11_SCOPED_ENUMS
-O1 -m32 -g -latomic
-levent -lboost_system -lboost_filesystem -levent_core -lgcc_s --rtlib=compiler-rt'
./configure \
--enable-static \
--disable-hardening \
--enable-util-cli \
--enable-util-tx \
--enable-util-wallet \
--with-libmultiprocess=no \
--with-incompatible-bdb \
--with-boost-libdir=/usr/lib/i386-linux-gnu
我注意到了
export EVENT_LIBS='-L/usr/lib/i386-linux-gnu;-levent'
看起来很奇怪的语法。根据我的快速扫描,${EVENT_LIBS}
只是在命令行中被替换。 ;
不分隔选项(它最多分隔链接目录)。而是使用空格来增加它做你期望的风险:
export EVENT_LIBS='-L/usr/lib/i386-linux-gnu -levent'
当然,将 -L 标志添加到 LDFLAGS 会更有意义。添加到 -l*
/CXXFLAGS
的所有 CFLAGS
选项也是如此。我不确定比特币核心是否遵守所有 automake 约定,但我希望将其分为 CPPFLAGS
、CFLAGS
、CXXFLAGSand
LDFLAGS`:
export EVENT_PTHREADS_CFLAGS='-pthread'
export EVENT_CFLAGS='-I/usr/lib/i386-linux-gnu'
export EVENT_LIBS='-L/usr/lib/i386-linux-gnu -levent'
export CPPFLAGS='-I/usr/lib/i386-linux-gnu
-DBOOST_NO_CXX11_SCOPED_ENUMS
-O1 -m32 -g
--rtlib=compiler-rt'
export LDFLAGS='-latomic -levent -levent_core
-lboost_system -lboost_filesystem
-lgcc_s'
./configure \
--enable-static \
--disable-hardening \
--enable-util-cli \
--enable-util-tx \
--enable-util-wallet \
--with-libmultiprocess=no \
--with-incompatible-bdb \
--with-boost-libdir=/usr/lib/i386-linux-gnu
免责声明我没有试过这个。