Boost بهعنوان بخشی از زیرساخت.
Boost در کنار کتابخانهٔ استاندارد C++، CMake و Qt یکی از اجزای اصلی پشتهٔ بومی Genyleap است. هرجا کتابخانهٔ استاندارد قابلیت موردنیاز را بهخوبی فراهم میکند، همان را ترجیح دهید؛ اما برای شبکه، کانتینرها، محاسبات عددی، تجزیه، سازگاری و قابلیت حمل گستردهتر از Boost استفاده کنید.
از Boost هدفمند استفاده کنید.
فقط به این دلیل که نسخههای قدیمی C++ قابلیتی مشابه نداشتند، وابستگی به Boost را حفظ نکنید.
فقط مؤلفههای Boost را به هر هدف متصل کنید که واقعاً به آنها نیاز دارد؛ کل Boost را به یک وابستگی سراسری و ضمنی تبدیل نکنید.
حتی اگر فایل باینری پیوند داده نشود، کتابخانههای فقط-سرآیند روی زمان کامپایل، هشدارها، نیازمندیهای قابلیتها و وابستگیهای غیرمستقیم اثر میگذارند.
برای هر سیستمعامل، ABI، معماری، خانوادهٔ کامپایلر و گونهٔ باینری، مسیر نصب جداگانه نگه دارید.
آخرین نسخهٔ پایدار کد منبع را دریافت کنید.
نسخه از صفحهٔ رسمی آخرین انتشار Boost شناسایی میشود و بهصورت ثابت داخل راهنما نوشته نمیشود.
mkdir -p "$HOME/Boost/Src"
cd "$HOME/Boost/Src"
curl -fLO "https://archives.boost.io/release/1.92.0/source/boost_1_92_0.tar.bz2"
tar -xf "boost_1_92_0.tar.bz2"
export BOOST_SRC="$HOME/Boost/Src/boost_1_92_0"
کتابخانههای کامپایلشوندهٔ Boost را بسازید؛ موارد فقط-سرآیند را بیدلیل دوباره کامپایل نکنید.
بسیاری از کتابخانههای Boost فقط از فایلهای سرآیند تشکیل شدهاند. کتابخانههایی که باینری تولید میکنند باید برای هر پلتفرم و ABI جداگانه ساخته و در مسیر نصب مشخص قرار داده شوند. پروژههای Genyleap سپس هم مؤلفههای فقط-سرآیند و هم مؤلفههای کامپایلشده را از طریق هدفهای CMake مصرف میکنند.
cd "$BOOST_SRC"
./bootstrap.sh
./b2 --version
cd C:\Boost\Src\boost_1_92_0bootstrap.bat
b2.exe --version
یک درخت کد منبع Boost میتواند مشترک باشد، اما خروجیهای کامپایلشده از کامپایلرها یا معماریهای متفاوت هرگز نباید داخل یک مسیر نصب با هم مخلوط شوند.
macOS.
برای باینریهایی که با Apple SDK یکپارچه میشوند از Apple Clang استفاده کنید. روی Apple Silicon، نصبهای Boost برای arm64 و x86_64 را جدا نگه دارید؛ یک برنامهٔ یونیورسال میتواند وابستگیهای هر معماری را در مرحلهٔ بستهبندی برنامه ترکیب کند.
arm64
cd "$BOOST_SRC"
./b2 toolset=clang architecture=arm address-model=64 variant=release threading=multi link=static,shared cxxflags="-arch arm64" linkflags="-arch arm64" --prefix="$HOME/Boost/1.92.0/macos-arm64" install
x86_64
cd "$BOOST_SRC"
./b2 toolset=clang architecture=x86 address-model=64 variant=release threading=multi link=static,shared cxxflags="-arch x86_64" linkflags="-arch x86_64" --prefix="$HOME/Boost/1.92.0/macos-x86_64" install
file "$HOME/Boost/1.92.0/macos-arm64/lib/"*
file "$HOME/Boost/1.92.0/macos-x86_64/lib/"*
معماریهای Linux.
| معماری | زنجیرهابزار | مدل ساخت |
|---|---|---|
x86_64 | GCC or Clang | بومی |
arm64 / aarch64 | GCC or Clang | بومی یا کامپایل متقابل |
armv7 / armhf | arm-linux-gnueabihf | معمولاً کامپایل متقابل |
riscv64 | Target-specific GCC/Clang | Linux سفارشی با کامپایل متقابل |
ساخت بومی x86_64
cd "$BOOST_SRC"
./b2 toolset=gcc architecture=x86 address-model=64 variant=release threading=multi link=static,shared --prefix="$HOME/Boost/1.92.0/linux-x86_64" install
ساخت بومی arm64 / aarch64
cd "$BOOST_SRC"
./b2 toolset=gcc architecture=arm address-model=64 variant=release threading=multi link=static,shared --prefix="$HOME/Boost/1.92.0/linux-arm64" install
ARMv7 با کامپایل متقابل
برای Linux نهفته، کامپایلر متقابل را در پیکربندی اختصاصی Boost.Build تعریف کنید و sysroot و زنجیرهابزار هدف را دقیقاً با تصویر سیستم دستگاه هماهنگ نگه دارید.
user-config-armv7.jamusing gcc : armv7 : arm-linux-gnueabihf-g++ ;
cd "$BOOST_SRC"
./b2 --user-config="$HOME/Boost/Toolchains/user-config-armv7.jam" toolset=gcc-armv7 target-os=linux architecture=arm address-model=32 abi=aapcs binary-format=elf variant=release threading=multi link=static --prefix="$HOME/Boost/1.92.0/linux-armv7" install
Windows.
Boost.Build را داخل محیط توسعهٔ مناسب Visual Studio اجرا کنید. خروجیهای x64 و ARM64 را جدا نگه دارید، همانطور که درختهای ساخت MSVC و clang-cl را جدا نگه میدارید.
x64 · MSVC
cd C:\Boost\Src\boost_1_92_0
b2.exe ^
toolset=msvc ^
architecture=x86 ^
address-model=64 ^
variant=release ^
threading=multi ^
link=static,shared ^
--prefix=C:\Boost\1.92.0\windows-x64 ^
install
ARM64 · MSVC
cd C:\Boost\Src\boost_1_92_0
b2.exe ^
toolset=msvc ^
architecture=arm ^
address-model=64 ^
variant=release ^
threading=multi ^
link=static,shared ^
--prefix=C:\Boost\1.92.0\windows-arm64 ^
install
ABIهای Android.
مؤلفههای فقط-سرآیند Boost فقط به فایلهای سرآیند نیاز دارند. کتابخانههای Boost که جداگانه کامپایل میشوند باید برای هر ABI اندروید با همان NDK مورد استفادهٔ برنامهٔ بومی، جداگانه کامپایل متقابل شوند.
| ABI | پیشوند کامپایلر NDK | معماری Boost |
|---|---|---|
arm64-v8a | aarch64-linux-android28-clang++ | arm / 64 |
armeabi-v7a | armv7a-linux-androideabi28-clang++ | arm / 32 |
x86_64 | x86_64-linux-android28-clang++ | x86 / 64 |
x86 | i686-linux-android28-clang++ | x86 / 32 |
export ANDROID_NDK_ROOT="$HOME/Library/Android/sdk/ndk/27.2.12479018"
export NDK_LLVM="$(find "$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt" -mindepth 1 -maxdepth 1 -type d | head -1)"
echo "$NDK_LLVM"
arm64-v8a
android-arm64.jamusing clang : android-arm64 :
$NDK_LLVM/bin/aarch64-linux-android28-clang++ ;
./b2 --user-config=android-arm64.jam toolset=clang-android-arm64 target-os=android architecture=arm address-model=64 abi=aapcs binary-format=elf link=static variant=release --prefix="$HOME/Boost/1.92.0/android-arm64-v8a" install
armeabi-v7a
android-armv7.jamusing clang : android-armv7 :
$NDK_LLVM/bin/armv7a-linux-androideabi28-clang++ ;
./b2 --user-config=android-armv7.jam toolset=clang-android-armv7 target-os=android architecture=arm address-model=32 abi=aapcs binary-format=elf link=static variant=release --prefix="$HOME/Boost/1.92.0/android-armeabi-v7a" install
x86_64
android-x86_64.jamusing clang : android-x86_64 :
$NDK_LLVM/bin/x86_64-linux-android28-clang++ ;
./b2 --user-config=android-x86_64.jam toolset=clang-android-x86_64 target-os=android architecture=x86 address-model=64 binary-format=elf link=static variant=release --prefix="$HOME/Boost/1.92.0/android-x86_64" install
دستگاه iOS و شبیهساز.
فایلهای سرآیند Boost میتوانند مشترک باشند، اما کتابخانههای کامپایلشدهٔ Boost باید دقیقاً با Apple SDK و معماری مورد استفادهٔ برنامه منطبق باشند. در خط مبنای فعلی Qt در Genyleap، کتابخانههای دستگاه از arm64 استفاده میکنند و کتابخانههای شبیهساز از x86_64استفاده میکنند؛ بنابراین مسیر نصب باینری این دو را جدا نگه دارید.
export IOS_DEVICE_SDK="$(xcrun --sdk iphoneos --show-sdk-path)"
export IOS_SIMULATOR_SDK="$(xcrun --sdk iphonesimulator --show-sdk-path)"
xcrun --sdk iphoneos --find clang++
xcrun --sdk iphonesimulator --find clang++
echo "$IOS_DEVICE_SDK"
echo "$IOS_SIMULATOR_SDK"
iOS device · arm64
cd "$BOOST_SRC"
./b2 \
toolset=clang \
target-os=iphone \
architecture=arm \
address-model=64 \
abi=aapcs \
binary-format=mach-o \
threading=multi \
link=static \
variant=release \
cxxflags="-arch arm64 -isysroot $IOS_DEVICE_SDK -miphoneos-version-min=18" \
linkflags="-arch arm64 -isysroot $IOS_DEVICE_SDK -miphoneos-version-min=18" \
--prefix="$HOME/Boost/1.92.0/ios-device" \
install
iOS Simulator · x86_64
cd "$BOOST_SRC"
./b2 \
toolset=clang \
target-os=iphone \
architecture=x86 \
address-model=64 \
binary-format=mach-o \
threading=multi \
link=static \
variant=release \
cxxflags="-arch x86_64 -isysroot $IOS_SIMULATOR_SDK -mios-simulator-version-min=18" \
linkflags="-arch x86_64 -isysroot $IOS_SIMULATOR_SDK -mios-simulator-version-min=18" \
--prefix="$HOME/Boost/1.92.0/ios-simulator" \
install
کتابخانههای فعلی Qt برای شبیهساز iOS با معماری x86_64هستند. روی Apple Silicon، کتابخانههای کامپایلشدهٔ Boost برای شبیهساز را نیز با معماری x86_64 بسازید تا بتوانند با همان برنامهٔ Qt پیوند بخورند؛ سپس مقصد شبیهساز را زیر Rosetta اجرا کنید.
بستهبندی اختیاری با XCFramework
اگر یک بستهٔ Apple میخواهید که هم خروجی دستگاه و هم شبیهساز را داشته باشد، برای هر کتابخانهٔ کامپایلشدهٔ Boost یک XCFramework جدا بسازید. مؤلفههای فقط-سرآیند Boost به XCFramework نیاز ندارند.
mkdir -p "$HOME/Boost/1.92.0/xcframeworks"
xcodebuild -create-xcframework \
-library "$HOME/Boost/1.92.0/ios-device/lib/libboost_filesystem.a" \
-headers "$HOME/Boost/1.92.0/ios-device/include" \
-library "$HOME/Boost/1.92.0/ios-simulator/lib/libboost_filesystem.a" \
-headers "$HOME/Boost/1.92.0/ios-simulator/include" \
-output "$HOME/Boost/1.92.0/xcframeworks/BoostFilesystem.xcframework"
lipo -info "$HOME/Boost/1.92.0/ios-device/lib/libboost_filesystem.a"
lipo -info "$HOME/Boost/1.92.0/ios-simulator/lib/libboost_filesystem.a"
For current Genyleap builds, use Xcode 16 or newer whenever the surrounding Qt/Apple toolchain requires it.
Boost را با هدفهای مدرن CMake مصرف کنید.
پوشههای include را بهصورت سراسری اضافه نکنید و نام فایلهای کتابخانه را دستی به هم نچسبانید. CMake را به مسیر Boost مخصوص همان معماری متصل کنید و هدفهای واردشدهٔ Boost را فقط به هدفی پیوند دهید که واقعاً مالک آن وابستگی است.
find_package(Boost 1.92.0 CONFIG REQUIRED
COMPONENTS
asio
filesystem
json
program_options
)
target_link_libraries(genyleap_core
PRIVATE
Boost::asio
Boost::filesystem
Boost::json
Boost::program_options
)
cmake -S . -B build/dev -G Ninja -DCMAKE_PREFIX_PATH="$HOME/Boost/1.92.0/macos-arm64"
cmake --build build/dev --parallel
پیکربندی فعلی بستهٔ CMake در Boost میتواند کتابخانههای فقط-سرآیند را نیز بهصورت مؤلفههای نامدار ارائه کند. هدفهای واردشدهای مانند Boost::asio یا Boost::mp11 را به تنظیمات سراسری include و پیونددهی در کل پوشه ترجیح دهید.
مرز واقعی کتابخانه را بررسی کنید، نه فقط موفق بودن دستور نصب را.
find "$HOME/Boost/1.92.0/macos-arm64" -maxdepth 2 -type f | head
file "$HOME/Boost/1.92.0/macos-arm64/lib/"*
سپس یک هدف واقعی و کوچک را از طریق find_package(Boost CONFIG ...)پیکربندی و کامپایل کنید. این کار بستهٔ CMake نصبشده، مسیرهای include، معماری باینری و نمودار وابستگیهای غیرمستقیم را یکجا بررسی میکند.