Trik untuk keberhasilan penggunaan vcpkg dalam proyek C dan C ++ | Oleh Andre Müller | Juni 2022

Programming

[ad_1]
Halo Gaes di suratpembaca.web.id. Malam ini kita akan membicarakan tentang Linux yakni Trik untuk keberhasilan penggunaan vcpkg dalam proyek C dan C ++ | Oleh Andre Müller | Juni 2022

.

Sekiranya artikel tentang Trik untuk keberhasilan penggunaan vcpkg dalam proyek C dan C ++ | Oleh Andre Müller | Juni 2022

dapat memberikan faedah bagi Sahabat semua. Mari baca postingan ini
hingga selesai.

Pelajari cara menggunakan vcpkg secara efektif untuk mengelola dependensi perpustakaan Anda

Foto oleh Claudio Schwartz di Unsplash

Saat ini, bahasa modern (seperti Go) sering menawarkan manajemen paket terintegrasi untuk menarik semua dependensi perpustakaan. Namun, banyak perangkat lunak dibuat dan dipelihara dalam C / C ++ dan tidak ada manajer paket di luar kotak untuk itu.

Biasanya sangat sulit untuk mem-port aplikasi ke platform target lain (macOS, Windows, Linux). Berguna, ada manajer tertutup pihak ketiga untuk itu. Salah satunya disebut vcpkg, sebuah proyek open source yang disediakan oleh Microsoft. Berikut ini, saya akan menunjukkan beberapa trik yang mencakup beberapa masalah di vcpkg.

Semua paket di vcpkg diunduh, ditambal, dan dikompilasi dari sumber. Jadi, butuh beberapa waktu saat menggunakan perpustakaan besar, seperti boost, ITK atau OpenCV!

Mulailah dengan memeriksa versi terbaru vcpkg dengan hanya mensimulasikan repositori menggunakan Git. Selain itu, bergantung pada platform Anda, Anda memerlukan kompiler C ++ (GCC, MinGW, dentang, Visual Studio cl, Xcode) dan CMake. Di macOS, saya merekomendasikan homebrew untuk dependensi:

brew install cmake

Anda sekarang dapat menginstal vcpkg:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh

Jika Anda ingin volume tangki dikurangi (sehingga Anda tidak akan melihat riwayat lama), Anda dapat menambahkan opsi ini --depth=1 Kemudian membaca perintah klon

git clone --depth=1 https://github.com/Microsoft/vcpkg.git

Memperbarui vcpkg sekarang mudah: hubungi git pull Di jalur menginstal vcpkg Anda. Namun berhati-hatilah saat Anda sedang terburu-buru. Pustaka vcpkg proyek dan afiliasi Anda harus dikompilasi ulang setelah langkah ini!

Anda disarankan agar jalur direktori instalasi vcpkg tetap pendek dan gratis (mis. /opt/vcpkg Atau C:\opt\vcpkg), Khusus untuk Windows, karena terdapat paket-paket (penguat) yang memiliki hierarki yang relatif dalam.

Kami memanggil direktori instalasi vcpkg VCPK_ROOT Berikut ini membuatnya lebih mudah dan lebih portabel untuk digunakan:

  • Buat variabel lingkungan VCPK_ROOT Mengacu pada direktori instalasi vcpkg.
  • Lihat file CMake Anda untuk jalur hard coding.

Atau, Anda dapat memasukkan instalasi CMake ke CMake dengan menelepon: cmake -B cmake-build -DCMAKE_TOOLCHAIN_FILE=<VCPKG_ROOT>/scripts/buildsystems/vcpkg.cmake. Jadi sebaiknya dengan template vcpkg yang anda sediakan.

Kemudian, tambahkan direktori instalasi vcpkg ke pencarian Anda PATH.

Perintah vcpkg yang paling penting untuk menggunakan perpustakaan adalah:

vcpkg help <command> Menunjukkan bantuan pada baris perintah

vcpkg search Untuk menemukan perpustakaan (disebut port)

vcpkg install Untuk menginstal perpustakaan

Contohnya adalah:

vcpkg search catch

Yang mengembalikan

catch                    alias#1          Deprecated alias for Catch2 unit testing framework
catch-classic 1.12.2#1 A modern, header-only test framework for unit tests
catch2 3.0.1#1 A modern, header-only test framework for unit testing.
The result may be outdated. Run `git pull` to get the latest results.
If your port is not listed, please open an issue at and/or consider making a pull request:
https://github.com/Microsoft/vcpkg/issues

Jika Anda memutuskan untuk catch2 Anda dapat menginstal paket dengan yang berikut ini:

vcpkg install catch2

Perpustakaan akan dikompilasi dan diinstal di Anda VCPKG_ROOT Akibat mendarat di $VCPKG_ROOT/packages/<LIBRARY>_<TRIPLET>. Di akhir perintah instalasi, tip digunakan:

catch2 provides CMake targets:
# this is heuristically generated, and may not be correct
find_package(Catch2 CONFIG REQUIRED)
target_link_libraries(main PRIVATE Catch2::Catch2 Catch2::Catch2WithMain)

Dan terkadang itulah masalahnya. Tanpa memeriksa paket yang diinstal, mungkin menyesatkan dan tidak jelas tujuan CMake mana yang dapat digunakan di dalamnya. target_link_libraries.

Sekarang, apa itu kembar tiga?

Trilogi mencerminkan sistem target kompilasi (lihat trilogi). Itu seperti itu bagi saya x64-osx. Kembar tiga lainnya dapat misalnya, x64-windows-static. cincin vcpkg help triplet Untuk membuat daftar kemungkinan nilai untuk itu.

Apa yang bisa Anda kendalikan ketika Anda tidak puas dengan trio bawaan? vcpkg install Akan menentukan VCPKG_TARGET_TRIPLET Di file CMake Anda atau instal paket dengan --triplet Opsi seperti ini (berikut ini tidak berfungsi di macOS):

vcpkg install catch2 --triplet x64-windows

Pada -static Si kembar tiga membuat versi statis perpustakaan.

Ada dua cara berbeda untuk menginstal paket: Dalam mode klasik, perpustakaan baru dapat diinstal secara global. vcpkg install <port-name> Seperti yang ditunjukkan pada bagian terakhir. Dalam mode manifes, Anda harus membuat vcpkg.json Daftar file di direktori proyek Anda yang mencantumkan semua dependensi. Lihat Mode manifes untuk detail selengkapnya.

Ini memiliki keuntungan besar bahwa semua informasi yang dibutuhkan untuk sebuah proyek ada di satu tempat dan paket-paket yang diperlukan secara otomatis diunduh dan diinstal saat mengkompilasi proyek. Ini mirip dengan file mode Go. Berikut ini adalah kecil vcpkg.json File dari template vcpkg saya:


"name": "vcpkg-template",
"version-string": "0.0.1",
"dependencies": ["catch2"]

Sekarang ketika Anda membersihkan VCPKG_ROOT Direktori melalui kontak git clean -dxf Semua perpustakaan yang diinstal dan file yang diunduh akan hilang dan harus diinstal ulang. Selain itu, di sistem saya (macOS) vcpkg membuat file cache berikut: $HOME/.cache/vcpkg Yang harus dilepas untuk dibersihkan.

Dalam mode Manifes, pembersihan daftar proyek Anda juga menghapus semua pustaka yang diinstal. Jadi di build berikutnya, semuanya dikompilasi ulang.

Perilaku vcpkg dapat dikontrol dengan variabel CMake yang dapat:

  • Masuk CMakelists.txt Berkas (sebelum project() paragraf) atau
  • Didefinisikan pada baris perintah dengan cmake -D <VARIABLE>=<VALUE>Atau
  • Sebagai variabel lingkungan seperti <VARIABLE>=<VALUE> make -C

Variabel berikut adalah variabel yang paling penting dalam kaitannya dengan arsitektur target dan proses penautan (statis atau dinamis): VCPKG_TARGET_TRIPLET – Mengontrol tujuan konstruksi, seperti x64-windows-static Lihat Integrasi CMake untuk informasi lebih lanjut.

Ada beberapa nama untuk vcpkg yang perlu Anda ketahui untuk menggunakan perpustakaan. Dan ini tidak selalu mudah dan membutuhkan sedikit pencarian!

Jadi ada:

1. Bagian dari nama port vcpkg vcpkg.json Bagian dependensi atau di dalam Anda vcpkg install <PORT> Memerintah:

  
"dependencies": [ "boost-asio" ]

Perhatikan bahwa nama port tidak boleh mengandung karakter lain [a-zA-Z] Dan tanda hubung -.

2. Fitur yang dipilih vcpkg.json Terlihat seperti ini:


"dependencies": [

"name": "opencv",
"features": [ "png" ]

]

3. Nama paket CMake dapat ditemukan oleh find_package(<PKG> REQUIRED)

4. Beri nama komponen CMake di find_package(<PKG> REQUIRED COMPONENTS <COMP1> <COMP2>)

5 target_link_library(myApp PRIVATE <DEP1> <DEP2> Nama target terkadang bergantung target_include_directories() Selain itu harus disesuaikan!

Contoh kontradiksi ini adalah sebagai berikut:

  • Nama port vcpkg: boost-asio
  • Nama paket CMake: find_package(boost_asio CONFIG REQUIRED) – Nama panggilan target Boost::asio Untuk menghubungkan target_link_library(myApp PRIVATE Boost::asio). Setelah mencari di Google, Anda akan menemukan bahwa Anda mungkin memerlukan tautan $Boost_LIBRARIES Yang tidak membantu menggunakan port booster.

Beberapa paket mengirimkan pesan yang kurang lebih berguna saat CMake berjalan untuk mendukung pengguna tentang cara menyertakan pustaka tertentu, seperti berikut ini:

The package boost is compatible with built-in CMake targets:    find_package(Boost REQUIRED [COMPONENTS <libs>...])
target_link_libraries(main PRIVATE Boost::boost Boost::<lib1> Boost::<lib2> ...)

Tetapi Anda tidak dapat dengan mudah menemukan nama target CMake! Sangat menarik bahwa di ports Direktori adalah file penggunaan yang menunjukkan metode yang benar target_link_libraries().

/opt/vcpkg/ports/boost> cat usage
The package boost is compatible with built-in CMake targets:

find_package(Boost REQUIRED [COMPONENTS <libs>...])
target_link_libraries(main PRIVATE $Boost_LIBRARIES)
target_include_directories(main PRIVATE $Boost_INCLUDE_DIRS)

find_package(Boost REQUIRED [COMPONENTS <libs>...])
target_link_libraries(main PRIVATE $Boost_LIBRARIES)
target_include_directories(main PRIVATE $Boost_INCLUDE_DIRS)

Artikel bagus lainnya (lihat Cara Menemukan Paket dengan CMake: Dasar-dasar) membahas masalah umum dalam menemukan paket di CMake tanpa vcpkg. Satu hal adalah inspeksi Find<Package>.cmake File di dalam direktori instalasi vcpkg.

Namun, file CMake di perpustakaan booster jauh lebih kompleks dari ini. Paket tidak semuanya homogen dan sederhana. Kabar baiknya adalah semua paket yang mendukung CMake biasanya lebih sederhana. Contoh yang bagus nlohmann-json Pustaka untuk pemutaran JSON.

Di sini pencetakan sangat berguna setelah instalasi:

The package nlohmann-json provides CMake targets:

find_package(nlohmann_json CONFIG REQUIRED)
target_link_libraries(main PRIVATE nlohmann_json::nlohmann_json)

The package nlohmann-json can be configured to not provide implicit conversions via a custom triplet file:

set(nlohmann-json_IMPLICIT_CONVERSIONS OFF)

For more information, see the docs here:

https://json.nlohmann.me/features/macros/#json_use_implicit_conversions

Jadi pertanyaannya adalah:

Di mana saya bisa mendapatkan semua nama ini?

Nama port dapat ditemukan online di https://vcpkg.io/en/packages.html atau bahkan lebih baik lagi https://vcpkg.info/ atau menggunakan alat baris perintah vcpkg. vcpkg search <name>. Sekali pelabuhan <PORT> Terinstal (kami berasumsi bahwa Anda telah menginstalnya secara global vcpkg install), Anda harus memeriksanya $VCPKG_ROOT/ports/<PORT>/portfile.cmake File seperti ini untuk boost-asio:

# Automatically generated by scripts/boost/generate-ports.ps1

vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
REPO boostorg/asio
REF boost-1.78.0
SHA512 78c58a64d669eaeabb5ba003200c581065412d33912e641143186ee95c11e0fb0411ed8dbb9a9acced8c8ecd258e0de33872b2e22dfc4a572315cd9a665db8a6
HEAD_REF master
PATCHES windows_alloca_header.patch
)

include($CURRENT_INSTALLED_DIR/share/boost-vcpkg-helpers/boost-modular-headers.cmake)
boost_modular_headers(SOURCE_PATH $SOURCE_PATH)

Selain itu, Anda dapat menonton untuk menemukan nama-nama fitur yang memungkinkan $VCPKG_ROOT/ports/<PORT>/vcpkg.json File paket ini:

Untuk rasa ingin tahu, Anda dapat membuat daftar semua dependensinya boost-asio Melalui kontak:

vcpkg depend-info boost-asio

Fitur yang diinstal ketika hanya nama port yang ditentukan vcpkg.json Fitur yang disebut adalah default. Perilaku ini dapat dinonaktifkan dengan menyetel "default-features": false Opsi aktif vcpkg.json File di dependencies bagian. Oleh karena itu, satu vcpkg.json File tersebut dapat dibaca sebagai berikut:


"name": "vcpkg-template",
"version-string": "0.0.1",
"dependencies": [

"name": "boost",
"default-features": false

]

Kunjungi https://vcpkg.readthedocs.io/en/latest/users/selecting-library-features/.

Saya menyajikan survei singkat tentang penggunaan vcpkg dengan tips dan trik di artikel ini. Menggunakan vcpkg tidak selalu sesederhana itu. Saya membuat template vcpkg kecil untuk proyek baru.

Anda dapat melihat template vcpkg saya di GitHub untuk desain awal proyek C ++ dan menggunakannya lagi. Jadi hanya git clone https://github.com/andremueller/vcpkg-template Dan mulai

Masalah menarik lainnya adalah dukungan penyalinan vcpkg (lihat Mengontrol dependensi vcpkg Anda dengan dukungan penyalinan). Ada alternatif untuk vcpkg seperti Conan atau build2.

Itu tadi postingan mengenai Trik untuk keberhasilan penggunaan vcpkg dalam proyek C dan C ++ | Oleh Andre Müller | Juni 2022

, terimakasih sudah mengunjungi website saya, semoga artikelnya ada manfaatnya ya.

[ad_2]

Source link

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.