C++
在 ARM 架構上鍊接到 libsecp256k1 的問題
試圖編譯
g++ -o addr 69_addr2.cpp $(pkg-config --cflags --libs libbitcoin)
是讓我這個錯誤:/usr/bin/ld: /home/pi/libbitcoininstall/lib/libsecp256k1.a(libsecp256k1_la-secp256k1.o): in function `secp256k1_num_mod_inverse': /home/pi/GitBen/LibbitcoinBen/build-libbitcoin/secp256k1/src/num_gmp_impl.h:128: undefined reference to `__gmpn_gcdext' /usr/bin/ld: /home/pi/libbitcoininstall/lib/libsecp256k1.a(libsecp256k1_la-secp256k1.o): in function `__gmpn_sub': /usr/include/arm-linux-gnueabihf/gmp.h:2190: undefined reference to `__gmpn_sub_n' /usr/bin/ld: /home/pi/libbitcoininstall/lib/libsecp256k1.a(libsecp256k1_la-secp256k1.o): in function `secp256k1_num_set_bin': /home/pi/GitBen/LibbitcoinBen/build-libbitcoin/secp256k1/src/num_gmp_impl.h:49: undefined reference to `__gmpn_set_str' /usr/bin/ld: /home/pi/GitBen/LibbitcoinBen/build-libbitcoin/secp256k1/src/num_gmp_impl.h:49: undefined reference to `__gmpn_set_str' /usr/bin/ld: /home/pi/libbitcoininstall/lib/libsecp256k1.a(libsecp256k1_la-secp256k1.o): in function `secp256k1_num_get_bin': /home/pi/GitBen/LibbitcoinBen/build-libbitcoin/secp256k1/src/num_gmp_impl.h:34: undefined reference to `__gmpn_get_str' /usr/bin/ld: /home/pi/libbitcoininstall/lib/libsecp256k1.a(libsecp256k1_la-secp256k1.o): in function `secp256k1_num_set_bin': /home/pi/GitBen/LibbitcoinBen/build-libbitcoin/secp256k1/src/num_gmp_impl.h:49: undefined reference to `__gmpn_set_str' /usr/bin/ld: /home/pi/GitBen/LibbitcoinBen/build-libbitcoin/secp256k1/src/num_gmp_impl.h:49: undefined reference to `__gmpn_set_str' /usr/bin/ld: /home/pi/libbitcoininstall/lib/libsecp256k1.a(libsecp256k1_la-secp256k1.o): in function `secp256k1_num_get_bin': /home/pi/GitBen/LibbitcoinBen/build-libbitcoin/secp256k1/src/num_gmp_impl.h:34: undefined reference to `__gmpn_get_str' collect2: error: ld returned 1 exit status
為什麼會有對
build-libbitcoin
目錄的引用?我安裝
libbitcoin
在/home/pi/libbitcoininstall
其中,另一個目錄只是自動安裝腳本放置所有文件的 git。所以,這個過程應該結束了。為什麼我什至可以列印那個目錄?
安裝沒有錯誤。
我在覆盆子上做這個(有關係嗎?)
我嘗試編譯的小程序來自教科書:
#include <bitcoin/bitcoin.hpp> int main() { bc::ec_secret secret; bool success = bc::decode_base16(secret,"038109007313a5807b2eccc082c8c3fbb988a973cacf1a7df9ce725c31v14776"); assert(success); bc::ec_point public_key = bc::secret_to_public_key(secret); std::cout << "Public key: " << bc::encode_hex(public_key) << std::endl; const bc::short_hash hash = bc::bitcoin_short_hash(public_key); bc::data_chunk unencoded_address; unencoded_address.reserve(25); unencoded_address.push_back(0); bc::extend_data(unencoded_address, hash); bc::append_checksum(unencoded_address); assert(unencoded_address.size() == 25); const std::string address = bc::encode_base58(unencoded_address); std::cout << "Address: " << address << std::endl; return 0; }
似乎 pkg-config 在
build-libbitcoin
目錄中找到了 libsecp256k1。這是 的一部分libbitcoin
,所以他們可能在那裡建構 libsecp25k61。您的程式碼無法編譯的原因是您的 libsecp 已
libgmp
啟用編譯,現在這是一個動態連結。因此,如果您嘗試在此處創建二進製文件,則需要添加
-lgmp
,如果它不在您的系統庫中,您還需要為.so
文件提供位置另一種選擇是重新編譯 libsecp 並禁用 libgmp 連結。
--static
我可以通過使用屬性來解決這個問題:
g++ -o addr 69_addr2.cpp $(pkg-config --cflags --libs --static libbitcoin)