C++

在 ARM 架構上鍊接到 libsecp256k1 的問題

  • September 24, 2019

試圖編譯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)

引用自:https://bitcoin.stackexchange.com/questions/90596