I-install ang Qiskit C API
Inilalarawan ng gabay na ito kung paano i-install at gamitin ang Qiskit C API. Para malaman kung paano palawakin ang iyong Qiskit Python workflow gamit ang C, basahin ang Extend Python with the Qiskit C API.
Ang sumusunod na halimbawa ay gumagawa ng observable gamit ang C:
// file: example.c
#include <stdio.h>
#include <stdint.h>
#include <qiskit.h>
int main(int argc, char *argv[]) {
// build a 100-qubit empty observable
uint32_t num_qubits = 100;
QkObs *obs = qk_obs_zero(num_qubits);
// add the term 2 * (X0 Y1 Z2) to the observable
QkComplex64 coeff = {2, 0};
QkBitTerm bit_terms[3] = {QkBitTerm_X, QkBitTerm_Y, QkBitTerm_Z}; // bit terms: X Y Z
uint32_t indices[3] = {0, 1, 2}; // indices: 0 1 2
QkObsTerm term = {coeff, 3, bit_terms, indices, num_qubits};
qk_obs_add_term(obs, &term); // append the term
// print some properties and the observable itself
printf("num_qubits: %i\n", qk_obs_num_qubits(obs));
printf("num_terms: %lu\n", qk_obs_num_terms(obs));
printf("observable: %s\n", qk_obs_str(obs));
// free the memory allocated for the observable
qk_obs_free(obs);
return 0;
}
UNIX-likeβ
Ang seksyong ito ay nagbibigay ng mga tagubilin sa pag-build para sa mga UNIX-like na sistema.
Mga Kinakailanganβ
Ang compilation ay nangangailangan ng mga sumusunod na tools:
- Isang Rust compiler: tingnan halimbawa ang gabay sa pag-install ng Qiskit mula sa source
- Isang C compiler: halimbawa, GCC sa Linux at Clang sa MacOS. Ang Qiskit C API ay compatible sa isang compiler na sumusunod sa pamantayang C11.
cbindgen: isang tool para gumawa ng C header, na maaari mong i-install gamit angcargo install cbindgenTandaan na ang pagpapatakbo ng tool mula sa command line ay dapat na naka-enable, na maaaring mangailangan ng pag-export ng iyongPATHvariable para isama ang/path/to/.cargo/bin- Naka-install na Python library (Python 3.9+): Kailangan ang Python library sa panahon ng dynamic linking. Pansinin na hindi ginagamit ang Python sa runtime at hindi kailanman ini-initialize ang interpreter; ilang simbolo lamang mula sa
libpythonang kailangang tukuyin. Tingnan ang isyung ito para sa karagdagang detalye - (GNU) Make: opsyonal ito ngunit inirerekomenda para sa mga automated na proseso ng pag-install.
Bine-verify ng code na ito na naka-install na ang lahat:
rustc --version
gcc --version
cbindgen --version
make --version # optional, but recommended
Buildβ
Para i-build ang C header at library, maaari kang magpatakbo ng sumusunod na Make command1 sa Qiskit root,
make c
na magbibigay ng compiled shared library sa dist/c/lib at ang qiskit.h header na may
lahat ng function declaration sa dist/c/include. Tandaan na ang eksaktong pangalan ng library ay depende
sa platform; halimbawa, libqiskit.so sa UNIX at libqiskit.dylib sa MacOS.
(Tandaan na ang hakbang na ito ay kasalukuyang naglalabas ng maraming babala, na inaasahan, at walang dapat ipag-alala. Aalisin ng mga susunod na bersyon ang mga babala.)
Maaari ka na nitong mag-compile ng C program gamit ang Qiskit C header at library:
gcc example.c -o example.o -I /path/to/dist/c/include -L /path/to/dist/c/lib -lqiskit
Para masiguro na mahahanap ang Qiskit library sa panahon ng linking, itakda ang runtime library path para
isama ang /path/to/dist/c/lib. Kung ang Python library ay hindi available bilang default sa panahon ng dynamic linking,
kailangan din itong idagdag. Ang mga command na ito ay depende sa platform. Sa Linux:
export LD_LIBRARY_PATH=/path/to/dist/c/lib:$LD_LIBRARY_PATH
# on Linux, the Python library is typically included in the dynamic library path per default
export LD_LIBRARY_PATH=/path/to/python/lib:$LD_LIBRARY_PATH
Sa MacOS:
export DYLD_LIBRARY_PATH=/path/to/dist/c/lib:$DYLD_LIBRARY_PATH
export DYLD_LIBRARY_PATH=/path/to/python/lib:$DYLD_LIBRARY_PATH
Bilang alternatibo, maaari mong itakda ang runtime library path sa panahon ng compilation sa pamamagitan ng pagdaragdag ng
-Wl,-rpath,/path/to/dist/c/lib
# same for Python
sa mga compiler flag. Bukod pa rito, kailangan na available ang Python library sa panahon ng dynamic linking. Sa mga Linux environment ito ay karaniwang default.
Maaari ka na ngayong i-execute ang binary:
./example.o
na, kung gagamitin ang halimbawang snippet na ipinakita kanina, ay dapat mag-print ng
num_qubits: 100
num_terms: 1
observable: SparseObservable { num_qubits: 100, coeffs: [Complex { re: 2.0, im: 0.0 }], bit_terms: [X, Y, Z], indices: [0, 1, 2], boundaries: [0, 3] }
Windowsβ
Ang seksyong ito ay nagbibigay ng mga tagubilin sa pag-build para sa mga Windows system.
Mga Kinakailanganβ
Ang compilation ay nangangailangan ng mga sumusunod na tools:
- Isang Rust compiler: tingnan halimbawa ang gabay sa pag-install ng Qiskit mula sa source
- Isang C compiler: halimbawa, MSVC at ang native command prompt na nag-aalok ng command na
cl - Isang Python installation, na may access sa parehong
python3.libatpython3.dll cbindgen: isang tool para gumawa ng C header, na maaari mong i-install gamit angcargo install cbindgenTandaan na ang pagpapatakbo ng tool mula sa command line ay dapat na naka-enable, na maaaring mangailangan ng pag-update ng iyongPATHvariable para isama ang cargo path.
Buildβ
Una, i-compile ang qiskit_cext dynamic library, sa pamamagitan ng pagpapatakbo ng sumusunod sa Qiskit root
set PATH="\path\to\pythonlib";%PATH%
cargo rustc --release --crate-type cdylib -p qiskit-cext
Gagawa ito ng .dll dynamic library at ang kasamang .dll.lib file sa target/release.
Susunod, gumawa ng header gamit ang
cbindgen --crate qiskit-cext --output dist\c\include\qiskit.h
Isusulat nito ang MSVC-compatible na header sa dist\c\include.
Maaari ka na ngayong gumamit ng cl para i-compile ang C program. Para masiguro na mahahanap ng compiler ang qiskit library,
isinama natin ang target\release sa PATH variable.
set PATH="\path\to\target\release";%PATH%
cl example.c qiskit_cext.dll.lib -I\path\to\dist\c\include
Bago patakbuhin, kailangan mong isama ang path sa iyong python3.dll.
set PATH="\path\to\python3-dll";%PATH%
.\example.exe
ay dapat na mag-print ng
num_qubits: 100
num_terms: 1
observable: SparseObservable { num_qubits: 100, coeffs: [Complex { re: 2.0, im: 0.0 }], bit_terms: [X, Y, Z], indices: [0, 1, 2], boundaries: [0, 3] }