


FAISS CGO melontar 'simbol tidak ditentukan untuk arm64 seni bina' apabila menggunakan libfaiss_c.a
Editor PHP Zimo menghadapi masalah apabila menggunakan libfaiss_c.a, iaitu, FAISS CGO melemparkan ralat "simbol tidak ditentukan untuk arm64 seni bina". Ralat ini mungkin disebabkan oleh kehilangan beberapa simbol apabila menggunakan libfaiss_c.a pada seni bina ARM 64-bit. Untuk menyelesaikan masalah ini, anda boleh cuba mengemas kini atau menyusun semula libfaiss_c.a untuk memastikan ia adalah versi yang sesuai untuk seni bina arm64. Selain itu, anda boleh menyemak sama ada pilihan kompilasi dan pautan yang betul digunakan. Saya harap penyelesaian ini dapat membantu pembangun yang menghadapi masalah yang sama.
Kandungan soalan
Saya cuba menulis pembungkus tersendiri go-faiss
untuk memanggil fungsi KMEANS FAISS.
Gudang: https://www.php.cn/link/4e4faae72b1c3cbd446a70e89e59d8fc
Pendekatan ini diilhamkan oleh https://github.com/andyalm/faissmask/tree/master/FaissMask/runtimes
Perpustakaan statik FAISSlibfaiss_c.a
使用-DBUILD_SHARED_LIBS=OFF
membina
Apabila saya memautkan perpustakaan ini dengan CGO, saya mendapat
log ralat# faiss-go/pkg/ivf.test /usr/local/go/pkg/tool/darwin_arm64/link: running clang failed: exit status 1 Undefined symbols for architecture arm64: "faiss::Clustering::Clustering(int, int)", referenced from: _faiss_Clustering_new in libfaiss_c.a(Clustering_c.cpp.o) "faiss::Clustering::Clustering(int, int, faiss::ClusteringParameters const&)", referenced from: _faiss_Clustering_new_with_params in libfaiss_c.a(Clustering_c.cpp.o) "faiss::kmeans_clustering(unsigned long, unsigned long, unsigned long, float const*, float*)", referenced from: _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) "faiss::ClusteringParameters::ClusteringParameters()", referenced from: _faiss_ClusteringParameters_init in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_new_with_params in libfaiss_c.a(Clustering_c.cpp.o) "std::exception_ptr::exception_ptr(std::exception_ptr const&)", referenced from: _faiss_get_last_error in libfaiss_c.a(error_impl.cpp.o) "std::exception_ptr::~exception_ptr()", referenced from: _faiss_get_last_error in libfaiss_c.a(error_impl.cpp.o) thread-local wrapper routine for faiss_last_exception in libfaiss_c.a(error_impl.cpp.o) _faiss_Clustering_new in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_new_with_params in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering.cold.1 in libfaiss_c.a(Clustering_c.cpp.o) ... "std::exception_ptr::operator=(std::exception_ptr const&)", referenced from: _faiss_Clustering_new in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_new_with_params in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering.cold.1 in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering.cold.2 in libfaiss_c.a(Clustering_c.cpp.o) "std::runtime_error::runtime_error(char const*)", referenced from: _faiss_Clustering_new in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_new_with_params in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) "std::runtime_error::runtime_error(std::runtime_error const&)", referenced from: std::exception_ptr std::make_exception_ptr[abi:v15006]<std::runtime_error>(std::runtime_error) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) "std::runtime_error::~runtime_error()", referenced from: _faiss_Clustering_new in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<std::runtime_error>(std::runtime_error) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_new_with_params in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering.cold.2 in libfaiss_c.a(Clustering_c.cpp.o) "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)", referenced from: std::exception_ptr std::make_exception_ptr[abi:v15006]<faiss::FaissException>(faiss::FaissException) in libfaiss_c.a(Clustering_c.cpp.o) faiss::FaissException::FaissException(faiss::FaissException const&) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) "std::exception::~exception()", referenced from: _faiss_Clustering_new in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<std::exception>(std::exception) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_new_with_params in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering.cold.1 in libfaiss_c.a(Clustering_c.cpp.o) "std::exception::~exception()", referenced from: std::exception_ptr std::make_exception_ptr[abi:v15006]<faiss::FaissException>(faiss::FaissException) in libfaiss_c.a(Clustering_c.cpp.o) faiss::FaissException::FaissException(faiss::FaissException const&) in libfaiss_c.a(Clustering_c.cpp.o) faiss::FaissException::~FaissException() in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) "std::current_exception()", referenced from: std::exception_ptr std::make_exception_ptr[abi:v15006]<std::runtime_error>(std::runtime_error) in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<std::exception>(std::exception) in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<faiss::FaissException>(faiss::FaissException) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) "std::rethrow_exception(std::exception_ptr)", referenced from: _faiss_get_last_error in libfaiss_c.a(error_impl.cpp.o) "std::terminate()", referenced from: ___clang_call_terminate in libfaiss_c.a(Clustering_c.cpp.o) "typeinfo for faiss::FaissException", referenced from: std::exception_ptr std::make_exception_ptr[abi:v15006]<faiss::FaissException>(faiss::FaissException) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) GCC_except_table21 in libfaiss_c.a(Clustering_c.cpp.o) GCC_except_table28 in libfaiss_c.a(Clustering_c.cpp.o) GCC_except_table29 in libfaiss_c.a(Clustering_c.cpp.o) GCC_except_table31 in libfaiss_c.a(Clustering_c.cpp.o) ... "typeinfo for std::runtime_error", referenced from: std::exception_ptr std::make_exception_ptr[abi:v15006]<std::runtime_error>(std::runtime_error) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) "typeinfo for std::exception", referenced from: GCC_except_table0 in libfaiss_c.a(error_impl.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<std::exception>(std::exception) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) GCC_except_table21 in libfaiss_c.a(Clustering_c.cpp.o) GCC_except_table28 in libfaiss_c.a(Clustering_c.cpp.o) GCC_except_table29 in libfaiss_c.a(Clustering_c.cpp.o) ... "vtable for faiss::FaissException", referenced from: std::exception_ptr std::make_exception_ptr[abi:v15006]<faiss::FaissException>(faiss::FaissException) in libfaiss_c.a(Clustering_c.cpp.o) faiss::FaissException::FaissException(faiss::FaissException const&) in libfaiss_c.a(Clustering_c.cpp.o) faiss::FaissException::~FaissException() in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. "vtable for std::exception", referenced from: _faiss_Clustering_new in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<std::exception>(std::exception) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_new_with_params in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. "operator delete(void*)", referenced from: _faiss_Clustering_new in libfaiss_c.a(Clustering_c.cpp.o) faiss::FaissException::~FaissException() in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_new_with_params in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) "operator new(unsigned long)", referenced from: _faiss_Clustering_new in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_new_with_params in libfaiss_c.a(Clustering_c.cpp.o) "___cxa_allocate_exception", referenced from: std::exception_ptr std::make_exception_ptr[abi:v15006]<std::runtime_error>(std::runtime_error) in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<std::exception>(std::exception) in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<faiss::FaissException>(faiss::FaissException) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) "___cxa_begin_catch", referenced from: _faiss_get_last_error in libfaiss_c.a(error_impl.cpp.o) _faiss_Clustering_new in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<std::runtime_error>(std::runtime_error) in libfaiss_c.a(Clustering_c.cpp.o) ___clang_call_terminate in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<std::exception>(std::exception) in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<faiss::FaissException>(faiss::FaissException) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_new_with_params in libfaiss_c.a(Clustering_c.cpp.o) ... "___cxa_end_catch", referenced from: _faiss_get_last_error in libfaiss_c.a(error_impl.cpp.o) _faiss_Clustering_new in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<std::runtime_error>(std::runtime_error) in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<std::exception>(std::exception) in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<faiss::FaissException>(faiss::FaissException) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_new_with_params in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) ... "___cxa_free_exception", referenced from: std::exception_ptr std::make_exception_ptr[abi:v15006]<faiss::FaissException>(faiss::FaissException) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) "___cxa_throw", referenced from: std::exception_ptr std::make_exception_ptr[abi:v15006]<std::runtime_error>(std::runtime_error) in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<std::exception>(std::exception) in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<faiss::FaissException>(faiss::FaissException) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_train in libfaiss_c.a(Clustering_c.cpp.o) _faiss_kmeans_clustering in libfaiss_c.a(Clustering_c.cpp.o) "___gxx_personality_v0", referenced from: _faiss_get_last_error in libfaiss_c.a(error_impl.cpp.o) _faiss_Clustering_new in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<std::runtime_error>(std::runtime_error) in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<std::exception>(std::exception) in libfaiss_c.a(Clustering_c.cpp.o) std::exception_ptr std::make_exception_ptr[abi:v15006]<faiss::FaissException>(faiss::FaissException) in libfaiss_c.a(Clustering_c.cpp.o) faiss::FaissException::FaissException(faiss::FaissException const&) in libfaiss_c.a(Clustering_c.cpp.o) _faiss_Clustering_new_with_params in libfaiss_c.a(Clustering_c.cpp.o) ... ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
Saya menggunakan pengepala CGO ini
/* #cgo darwin LDFLAGS: -L${SRCDIR}/../../cgo/thirdparty/runtimes/osx-arm64/native -lfaiss_c #include <stdlib.h> #include <faiss/c_api/Clustering_c.h> #include <faiss/c_api/impl/AuxIndexStructures_c.h> #include <faiss/c_api/index_factory_c.h> #include <faiss/c_api/error_c.h> */
Namun, kod CGO ini berfungsi dengan baik apabila kita menggunakan -DBUILD_SHARED_LIBS=ON
构建 libfaiss_c.dylib
并将 libfaiss_c.dylib
添加到 /usr/local/lib
. Pengepala CGO kini kelihatan seperti ini
/* #cgo LDFLAGS: -lfaiss_c #include <stdlib.h> #include <faiss/c_api/Clustering_c.h> #include <faiss/c_api/impl/AuxIndexStructures_c.h> #include <faiss/c_api/index_factory_c.h> #include <faiss/c_api/error_c.h> */
Sila bantu saya memautkan *.a
fail dengan CGO daripada laluan tersuai.
Kemas kini 1
Apabila saya mempunyai fail ini dalam /usr/local/lib
Larian ujian
Fail yang ditulis /usr/local/lib
ini dibuat menggunakan fail make di bawah
GIT_COMMAND ?= git FAISS_COMMIT ?= d87888b13e7eb339bb9c45825e9d20def6665171 all: faiss .PHONY: faiss faiss: if [ -e faiss ]; then \ cd faiss && ${GIT_COMMAND} fetch origin && git reset --hard $(FAISS_COMMIT); \ else \ ${GIT_COMMAND} clone https://github.com/facebookresearch/faiss.git && cd faiss && git reset --hard $(FAISS_COMMIT); \ fi cd faiss && \ export CMAKE_PREFIX_PATH=/opt/homebrew/opt/openblas:/opt/homebrew/opt/libomp:/opt/homebrew && \ cmake -B build -DFAISS_ENABLE_GPU=OFF -DFAISS_ENABLE_C_API=ON -DBUILD_SHARED_LIBS=ON -DFAISS_ENABLE_PYTHON=OFF . && \ make -C build && \ sudo make -C build install && \ sudo cp build/c_api/libfaiss_c.dylib /usr/local/lib/libfaiss_c.dylib
Kemas kini 2
Untuk perpustakaan pangkalan data go-rocks, https://github.com/linxGnu/grocksdb#build
Mereka juga mengesyorkan memasang/membina perpustakaan rocksdb secara setempat dan memautkannya dengan antara muka cgo.
Adakah kaedah membina perpustakaan statik "*.a" secara bebas dan menyediakannya sebagai perpustakaan bebas sah?
Kemas kini 3
Versi Go
$ go version go version go1.20 darwin/arm64
Sistem pengendalian dan seni bina pemproses?
<p>$ go env GO111MODULE="on" GOARCH="arm64" GOBIN="" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="arm64" GOHOSTOS="darwin" GOINSECURE="" GONOPROXY="" GONOSUMDB="" GOOS="darwin" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/usr/local/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/darwin_arm64" GOVCS="" GOVERSION="go1.20" GCCGO="gccgo" AR="ar" CC="clang" CXX="clang++" CGO_ENABLED="1" GOMOD="/Users/me/GolandProjects/0learning/faiss-cgo-kmeans/go.mod" GOWORK="" CGO_CFLAGS="-O2 -g" CGO_CPPFLAGS="" CGO_CXXFLAGS="-O2 -g" CGO_FFLAGS="-O2 -g" CGO_LDFLAGS="-O2 -g" PKG_CONFIG="pkg-config"
Kemas kini 4
Rujukan: https://stackoverflow.com/a/63321095/1609570
<code>➜ native git:(master) otool -L libfaiss_c.a Archive : libfaiss_c.a libfaiss_c.a(AutoTune_c.cpp.o): libfaiss_c.a(Clustering_c.cpp.o): libfaiss_c.a(IndexFlat_c.cpp.o): libfaiss_c.a(IndexIVFFlat_c.cpp.o): libfaiss_c.a(IndexIVF_c.cpp.o): libfaiss_c.a(IndexLSH_c.cpp.o): libfaiss_c.a(IndexPreTransform_c.cpp.o): libfaiss_c.a(VectorTransform_c.cpp.o): libfaiss_c.a(IndexShards_c.cpp.o): libfaiss_c.a(IndexReplicas_c.cpp.o): libfaiss_c.a(Index_c.cpp.o): libfaiss_c.a(IndexBinary_c.cpp.o): libfaiss_c.a(IndexScalarQuantizer_c.cpp.o): libfaiss_c.a(MetaIndexes_c.cpp.o): libfaiss_c.a(clone_index_c.cpp.o): libfaiss_c.a(error_impl.cpp.o): libfaiss_c.a(index_factory_c.cpp.o): libfaiss_c.a(index_io_c.cpp.o): libfaiss_c.a(AuxIndexStructures_c.cpp.o): libfaiss_c.a(distances_c.cpp.o): ➜ native git:(master) </code>
Penyelesaian
Terima kasih kepada @HarishGanesan kerana menunjukkan bahawa FAISS c_api bergantung pada FAISS dan pemautan statik perlu memasukkannya juga.
Selepas mengkaji
Kod lengkap boleh didapati di sini
https://www.php.cn/link/307eb8ee16198da891c521eca21464c1
https://www.php.cn/link/d585d095b00cd2f5b50acb64add23834
Atas ialah kandungan terperinci FAISS CGO melontar 'simbol tidak ditentukan untuk arm64 seni bina' apabila menggunakan libfaiss_c.a. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!CockroachDB
的 c-rocksdb 的实现之后,我发现一些额外的标志可以帮助解决架构arm64CockroachDB pelaksanaan c-rocksdb, boleh saya temui beberapa Flag tambahan bantu selesaikan </p>simbol tidak ditentukan <p> untuk ralat seni bina arm64
/*
#cgo CPPFLAGS: -Ithirdparty/libfaiss-src/c_api
#cgo CFLAGS: -Ithirdparty/libfaiss-src/c_api
#cgo darwin LDFLAGS: -Lthirdparty/runtimes/osx-arm64/native -lfaiss_c -lfaiss -lomp
#cgo darwin LDFLAGS: -Wl,-undefined -Wl,dynamic_lookup
#cgo !darwin LDFLAGS: -Wl,-unresolved-symbols=ignore-all
#include <stdlib.h>
#include <Clustering_c.h>
#include <impl/AuxIndexStructures_c.h>
#include <index_factory_c.h>
#include <error_c.h>
*/
Kemas kini 1

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Sejak penubuhannya pada tahun 2009, Bitcoin telah menjadi peneraju dalam dunia mata wang kripto dan harganya telah mengalami turun naik yang besar. Untuk memberikan gambaran keseluruhan sejarah yang komprehensif, artikel ini menyusun data harga Bitcoin dari 2009 hingga 2025, meliputi peristiwa pasaran utama, perubahan dalam sentimen pasaran dan faktor penting yang mempengaruhi pergerakan harga.

Bitcoin, sebagai mata wang kripto, telah mengalami turun naik pasaran yang ketara sejak penubuhannya. Artikel ini akan memberikan gambaran keseluruhan harga sejarah Bitcoin sejak kelahirannya untuk membantu pembaca memahami arah aliran harga dan detik pentingnya. Dengan menganalisis data harga sejarah Bitcoin, kami dapat memahami penilaian pasaran terhadap nilainya, faktor yang mempengaruhi turun naiknya, dan menyediakan asas untuk keputusan pelaburan masa hadapan.

Sejak penciptaannya pada tahun 2009, harga Bitcoin telah mengalami beberapa turun naik utama, meningkat kepada $ 69,044.77 pada November 2021 dan jatuh ke $ 3,191.22 pada Disember 2018. Sehingga Disember 2024, harga terkini telah melebihi $ 100,204.

Harga USD Bitcoin masa nyata Faktor yang menjejaskan harga bitcoin Petunjuk untuk meramalkan harga bitcoin masa depan Berikut adalah beberapa maklumat penting mengenai harga Bitcoin pada 2018-2024:

Kaedah penyesuaian simbol saiz semula dalam CSS bersatu dengan warna latar belakang. Dalam perkembangan harian, kita sering menghadapi situasi di mana kita perlu menyesuaikan butiran antara muka pengguna, seperti menyesuaikan ...

Ya, pengeluaran halaman H5 adalah kaedah pelaksanaan penting untuk pembangunan front-end, yang melibatkan teknologi teras seperti HTML, CSS dan JavaScript. Pemaju membina halaman H5 yang dinamik dan berkuasa dengan bijak menggabungkan teknologi ini, seperti menggunakan & lt; kanvas & gt; Tag untuk menarik grafik atau menggunakan JavaScript untuk mengawal tingkah laku interaksi.

Bagaimana untuk mencapai kesan lengkung 45 darjah segmen? Dalam proses melaksanakan segmen, bagaimana membuat sempadan yang betul berubah menjadi lengkung 45 darjah ketika mengklik butang kiri, dan titik ...

Masalah pembukaan kontena kerana peninggalan teks yang berlebihan di bawah susun atur flex dan penyelesaian digunakan ...
