کانن: قهرمان متقابل کامپایل شما

در زمینه توسعه نرم افزار که به طور مداوم در حال تغییر است، زبان های برنامه نویسی مدرن مانند Rust و Go استانداردهای جدیدی را با ادغام مدیران بسته های داخلی ایجاد کرده اند. این ابزارها فرآیند توسعه را بسیار ساده کرده اند و به توسعه دهندگان این امکان را می دهند تا به راحتی وابستگی ها را مدیریت کنند، گردش کار خود را بهبود بخشند و بهره وری را افزایش دهند. راحتی ارائه شده توسط این مدیران بسته بر ضرورت یک راه حل قوی برای توسعه C++ تاکید می کند.
Conan یک مدیر بسته انقلابی است که برای توسعه دهندگان ++C ایجاد شده است. Conan مدیریت بسته را در اکوسیستم C++ ساده و ساده می کند و مدیریت کتابخانه و وابستگی را آسان تر از همیشه می کند. یکی از ویژگی های برجسته Conan پشتیبانی قوی از کامپایل متقابل است که برای توسعه دهندگانی که روی سیستم ها و برنامه های تعبیه شده کار می کنند که چندین معماری را هدف قرار می دهند ضروری است.
قابلیت های کامپایل متقابل Conan با این امکان که توسعه دهندگان برنامه های خود را برای محیط های هدف مختلف از یک راه اندازی واحد بسازند و آزمایش کنند، فرآیند توسعه را ساده می کند. این ویژگی به ویژه برای پروژههایی که نیاز به اجرای پیکربندیهای سختافزاری مختلف دارند، مفید است و از سازگاری و عملکرد در سراسر صفحه اطمینان میدهد.
علاوه بر این، Conan از طیف گستردهای از کتابخانهها پشتیبانی میکند و مخزن وسیعی را ارائه میدهد که توسعهدهندگان میتوانند از آن برای بهبود پروژههای خود استفاده کنند. این پشتیبانی گسترده از کتابخانه تضمین می کند که توسعه دهندگان به ابزارها و منابع مورد نیاز خود دسترسی دارند و زمان صرف شده برای پیکربندی و مدیریت وابستگی ها را کاهش می دهد.
برای سازمان هایی با الزامات خاص، Conan انعطاف پذیری برای مدیریت بسته های خصوصی با استفاده از Artifactory Community Edition فراهم می کند. این ادغام تضمین میکند که بستههای حساس یا اختصاصی امن باقی میمانند و فقط برای پرسنل مجاز قابل دسترسی هستند و یکپارچگی و محرمانه بودن فرآیند توسعه حفظ میشود.
1. Conan را به عنوان یک وابستگی با استفاده از CMake ادغام کنید
CMake's FetchContent
ماژول یک ویژگی قدرتمند معرفی شده در CMake 3.11 است که به شما امکان می دهد محتوای خارجی (مانند کد منبع یا اسکریپت ها) را مستقیماً در فرآیند ساخت خود بارگیری و اضافه کنید. این به ویژه برای مدیریت وابستگی های پروژه بدون نیاز به کتابخانه ها یا بسته های از پیش نصب شده مفید است.
1.1. ویژگی های کلیدی FetchContent
-
دانلود و شامل پروژه های خارجی:
FetchContent
می تواند محتوا را از URL ها، مخازن Git یا مسیرهای محلی دانلود کند. سپس این محتوا می تواند در ساخت شما گنجانده شود، گویی بخشی از درخت منبع شما است. - کنترل نسخه: با تعیین URL دقیق یا تگ/شاخه/تعهد Git، می توانید اطمینان حاصل کنید که پروژه شما همیشه از نسخه خاصی از محتوای خارجی استفاده می کند و ثبات و قابلیت تکرارپذیری را فراهم می کند.
- ادغام خودکار: محتوای واکشی شده را می توان به طور خودکار در سیستم ساخت CMake ادغام کرد و کامپایل کردن و پیوند دادن با محتوای دانلود شده را آسان می کند.
- پیکربندی و سفارشی سازی: میتوانید محتوای واکشی شده را با استفاده از متغیرهای CMake پیکربندی کنید و امکان سفارشیسازی و تنظیم دقیق نحوه ساخت و استفاده از محتوای خارجی را فراهم کنید.
1.2. رفع وابستگی Canon در CMake
برای مدیریت سیستم عامل های میزبان مختلف با استفاده از FetchContent CMake، می توانید وابستگی ها را به صورت مشروط بر اساس سیستم عامل شناسایی شده واکشی و پیکربندی کنید. برای مثال، ما روی پیادهسازی آن بر روی یک ماشین میزبان لینوکس تمرکز کردیم.
include(FetchContent)
FetchContent_Declare(conan
URL https://github.com/conan-io/conan/releases/download/2.3.2/conan-2.3.2-linux-x86_64.tgz
)
FetchContent_Populate(conan)
if (conan_POPULATED)
set(CONANEXE ${conan_SOURCE_DIR}/conan)
set(CONAN_AVAILABLE TRUE)
endif()
2. تعریف پروفایل برای کامپایل متقابل
در Conan، پروفایل ها برای تعریف تنظیمات، گزینه ها، متغیرهای محیطی و ابزارهایی که باید در طی فرآیند ایجاد و مصرف بسته استفاده شوند، استفاده می شود. هنگام کامپایل متقابل، ضروری است که بین نمایه های ساخت و میزبان تمایز قائل شوید و زنجیره های ابزار مناسب برای هر کدام تعریف کنید.
2.1. ساخت نمایه
نمایه ساخت محیطی را که ابزارهای ساخت در آن اجرا می شوند را مشخص می کند. این معمولاً دستگاه بومی شما (مثلا x86_64 لینوکس) است که کد را کامپایل می کند.
[settings]
arch=x86_64
build_type=Release
compiler=gcc
compiler.cppstd=gnu17
compiler.libcxx=libstdc++11
compiler.version=12
os=Linux
2.2. نمایه میزبان
نمایه میزبان محیطی را مشخص می کند که بسته کامپایل شده در آن اجرا شود. این می تواند یک معماری یا پلتفرم متفاوت باشد، مانند ARM برای سیستم های جاسازی شده.
[settings]
arch=armv8
build_type=Release
compiler=clang
compiler.cppstd=17
compiler.libcxx=libc++
compiler.version=12
os=Linux
[buildenv]
CC=/usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/bin/clang
CXX=/usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/bin/clang++
LD=/usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/bin/lld
SYSROOT=/usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/sysroot
CXXFLAGS=--sysroot=/usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/sysroot
CFLAGS=--sysroot=/usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/sysroot
3. کتابخانه های شخص ثالث با استفاده از Conan
Conan Center یک مخزن مرکزی بستههای منبع باز است که شامل طیف گستردهای از کتابخانههای آماده برای ادغام در پروژههای شما است.
3.1. جستجوی کتابخانه ها در مرکز کانن
- از مرکز Conan دیدن کنید: برای مرور یا جستجوی کتابخانه ها به Conan Center بروید.
-
جستجو برای کتابخانه: از نوار جستجو برای یافتن کتابخانه مورد نیاز خود استفاده کنید. به عنوان مثال، اگر شما به دنبال
eigen
کتابخانه، “eigen” را در نوار جستجو تایپ کنید. - کتابخانه را انتخاب کنید: روی کتابخانه از نتایج جستجو کلیک کنید تا جزئیات آن از جمله نسخهها، گزینههای موجود و دستورالعملهای استفاده را مشاهده کنید.
3.2. ایجاد یک conanfile.txt
فایل
این conanfile.txt
فایل برای تعریف وابستگی ها و تنظیمات پروژه شما استفاده می شود. در اینجا یک مثال است conanfile.txt
برای پروژه ای که به Eigen
و Boost
کتابخانه ها:
[requires]
eigen/3.4.0
boost/1.85.0
[generators]
CMakeDeps
CMakeToolchain
[layout]
cmake_layout
4. ادغام Conan با CMake
ادغام Conan با CMake یک روش معمول برای سادهسازی مدیریت وابستگی در پروژههای C++ است. Conan دانلود و مدیریت وابستگی ها را انجام می دهد، در حالی که CMake فرآیند ساخت را هماهنگ می کند.
if (${CONAN_AVAILABLE})
execute_process(COMMAND "${CONANEXE}" install conanfile.txt --build=missing --profile:build=conan.build --profile:host=conan.host
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
endif()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_BINARY_DIR}/Release/generators)
include(conan_toolchain)
find_package(Eigen3 REQUIRED)
find_package(Boost REQUIRED COMPONENTS filesystem)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} Eigen3::Eigen Boost::filesystem)
5. از کتابخانه ها در کد خود استفاده کنید
اکنون می توانید آن را وارد کرده و استفاده کنید Eigen
و Boost
کتابخانه های شما main.cpp
یا فایل های منبع دیگر
#include
#include
#include
int main() {
// Create a 2x2 matrix
Eigen::MatrixXd m(2, 2);
m 1, 2,
3, 4;
// Add another matrix
Eigen::MatrixXd v(2, 2);
v 5, 6,
7, 8;
m = m + v;
// Print the resulting matrix
std::cout "Resulting matrix:\n" m std::endl;
boost::filesystem::path my_file = "data.txt";
// Check if the file exists
if (boost::filesystem::exists(my_file)) {
std::cout my_file " exists." std::endl;
} else {
std::cout my_file " does not exist." std::endl;
}
// Create a directory (if it doesn't exist)
boost::filesystem::path my_dir = "test_dir";
if (!boost::filesystem::exists(my_dir)) {
boost::filesystem::create_directory(my_dir);
std::cout "Created directory: " my_dir std::endl;
}
return 0;
}
منابع