Dylib-byggkonfiguration och användning
Plattformar, bygge, C ABI
libPDFlibDylib.dylib är ett dynamiskt macOS-bibliotek med 880 C-ingångspunkter implementerade av Dylib/PDFlibDylib.dpr; Delphi- och FPC-byggen exponerar samma namn
Använd separata x64- och ARM64-byggen med en matchande macOS-process och nativa leverantörer
Delphi-korskompilering på Windows
Installera RAD Studio macOS-kompilatorn och importera ett Apple macOS SDK via SDK Manager; kompilatorn behöver en lokal SDK-rot som innehåller usr/lib, System/Library/Frameworks och SDK-versionsmetadata
SDK Manager-anslutningen använder PAServer på Macen; efterföljande kommandoradskompilering använder den lokala kompilatorn och SDK-cachen, medan runtime-tester körs på den riktiga Macen
Kopiera Dylib/Build-config.example.cmd till Dylib/Build-config.local.cmd och redigera dessa miljöstandardvärden för maskinen
@echo off
if not defined PDFLIBPAS_BDS_ROOT set "PDFLIBPAS_BDS_ROOT=C:\Path\To\RADStudio\37.0"
if not defined PDFLIBPAS_MACOS_SDK set "PDFLIBPAS_MACOS_SDK=C:\SDKs\MacOSX.sdk"
if not defined PDFLIBPAS_MACOS_LINKER set "PDFLIBPAS_MACOS_LINKER=C:\LLVM\bin\ld64.lld.exe"
exit /b 0
Detta är exempelsökvägar; ersätt dem med de sökvägar och den SDK-version som är installerade på din maskin, och kontrollera att SDK:n är kompatibel med kompilatorn
Använd en Mach-O-länkare, till exempel den installerade RAD Studio ld64.lld.exe, när standardlänkaren avvisar SDK:ns .tbd-stubbar; skriptet läser SDK-versionen och skickar med motsvarande -platform_version-argument; Intel-byggen kompilerar också en liten SDK-sökvägsadapter med Windows PowerShell för att lösa Delphis absoluta POSIX-biblioteksindata mot den valda cachen
Dylib\Build-dylib.bat osxarm64
Dylib\Build-dylib.bat osxarm64 debug
Dylib\Build-dylib-TRIAL.bat osxarm64
Dylib\Build-dylib-TRIAL.bat osxarm64 debug
Dylib\Build-dylib.bat osx64
Dylib\Build-dylib-TRIAL.bat osx64 debug
| Argument eller variabel | Betydelse |
|---|---|
37.0 | RAD Studio-registerversion som ska hittas när en rotsökväg inte anges; standardvärdet är 37.0 |
osxarm64 / osx64 | Väljer dccosxarm64.exe eller dccosx64.exe; det befintliga standardvärdet är osx64, så ange ARM64 uttryckligen för Apple silicon |
debug | Aktiverar felsökningsinformation, assertioner, intervallkontroller och överfullskontroller, med optimering avstängd; utelämnas valet väljs optimerad Release |
bdsroot path | Åsidosätter PDFLIBPAS_BDS_ROOT och registersökning; bdsroot=path accepteras också |
sdk path | Åsidosätter PDFLIBPAS_MACOS_SDK; sdk=path accepteras också |
PDFLIBPAS_MACOS_LINKER | Valfri absolut sökväg till Mach-O-länkaren; ta bort den för att använda kompilatorns standardlänkare |
PDFLIBPAS_DYLIB_CONFIG | Väljer ett annat lokalt konfigurationsskript; en uttryckligen vald fil som saknas gör att bygget misslyckas |
Skripten läser in den lokala konfigurationen innan argumenten tolkas, så uttryckliga kommandoradssökvägar har företräde; exempelkonfigurationen bevarar miljövärden som redan är definierade
Lokala konfigurationsfiler är körbara shell-skript avsedda för miljötilldelningar och ignoreras av Git; en icke-noll avslutningsstatus från konfigurationen stoppar bygget
För ett engångsbygge utan lokal konfigurationsfil skickar du sökvägarna direkt och sätter länkaren i det aktuella shellet
set PDFLIBPAS_MACOS_LINKER=C:\LLVM\bin\ld64.lld.exe
Dylib\Build-dylib.bat 37.0 osxarm64 bdsroot "C:\Path\To\RADStudio\37.0" sdk "C:\SDKs\MacOSX.sdk"
Batchskripten bygger om unit:er, väljer macOS-RTL:n, ignorerar automatiska kompilator-CFG-filer med --no-config och validerar Mach-O-CPU:n samt filtypen för det dynamiska biblioteket innan slututdata ersätts
PDFlibDylib.dproj exponerar macOS Debug- och Release-konfigurationer för IDE-användning; batchskripten tillhandahåller den dokumenterade FULL/TRIAL-separationen och den uttryckliga SDK-/länkarvägen, medan IDE:n använder sina egna registrerade SDK- och anslutningsinställningar
Nativ Free Pascal på macOS x64 och ARM64
Använd FPC 3.3.1 med det nativa målet aarch64-darwin eller x86_64-darwin, matchande RTL/paket och Apples kommandoradsutvecklarverktyg; kontrollera att kompletterande verktyg som fpcres finns på PATH eller i kompilatorkonfigurationen, och skriptet avvisar en kompilator vars CPU skiljer sig från den faktiska värden
Kopiera Dylib/Build-config.example.sh till Dylib/Build-config.local.sh och redigera sökvägarna, eller exportera variablerna direkt
export FPC=/path/to/aarch64-darwin/fpc
export PDFLIB_FPC_CONFIG=/path/to/aarch64-darwin/fpc.cfg
bash Dylib/Build-native.sh release full
bash Dylib/Build-native.sh debug trial
Utelämna PDFLIB_FPC_CONFIG när FPC redan hittar rätt konfiguration; när den anges använder runner:n -n @config för att välja den uttryckligen
Argumenten är positionsbundna: [release|debug] [full|trial], med release full som standard; PDFLIBPAS_DYLIB_CONFIG kan välja en annan shell-konfigurationsfil
PDFLIB_DYLIB_OUTPUT åsidosätter utdatakatalogen; använd en separat katalog för varje kompilator, arkitektur, konfiguration och utgåva för att undvika inaktuella eller felmatchade unit:er
FPC Debug aktiverar radinformation samt intervall-, överfulls- och I/O-kontroller med optimering avstängd; Release använder -O2 och TRIAL lägger till -dTRIAL
Lägg inte till -FcUTF8: det ändrar hanteringen av AnsiString med höga byte och kan förstöra binära PDF-identifierare och krypteringsvärden
Utdatakataloger
Alla sökvägar nedan är relativa till arkivroten och innehåller libPDFlibDylib.dylib
| Kompilator | FULL Release | FULL Debug | TRIAL Release | TRIAL Debug |
|---|---|---|---|---|
| Delphi ARM64 | Dylib/OSXARM64/Release | Dylib/OSXARM64/Debug | Dylib/OSXARM64/Release-TRIAL | Dylib/OSXARM64/Debug-TRIAL |
| FPC ARM64 | Dylib/OSXARM64/FPC-release-full | Dylib/OSXARM64/FPC-debug-full | Dylib/OSXARM64/FPC-release-trial | Dylib/OSXARM64/FPC-debug-trial |
Både Delphi- och FPC-utdata för Intel använder OSX64 i stället för OSXARM64, med samma konfigurations-/utgåvunderkataloger; ingen universell binärfil skapas av dessa skript
Körningsberoenden och driftsättning
| Provider | Standardplats för ARM64 | Används för |
|---|---|---|
| OpenSSL 3 | /opt/homebrew/opt/openssl@3/lib/libcrypto.3.dylib | Nativ kryptering, hashning, PFX/CMS-signering och verifiering |
| Cairo | /opt/homebrew/lib/libcairo.2.dylib | Nativ bitmappsrendering |
| Fontconfig | /opt/homebrew/lib/libfontconfig.1.dylib | Nativ typsnittssökning |
| OpenJPEG | /opt/homebrew/lib/libopenjp2.7.dylib | JPEG 2000 |
| libcurl | /usr/lib/libcurl.4.dylib | HTTP/HTTPS, intervallåtkomst och TSA-transport |
| libxml2 | /usr/lib/libxml2.2.dylib | Delphi XMP-parsning och serialisering |
Intel macOS ersätter leverantörsprefixet /opt/homebrew med /usr/local; systemsökvägarna under /usr/lib är desamma
Använd beroenden och en värdprocess med samma arkitektur som dylib-filen; systembibliotek kan tillhandahållas av macOS delade cache i stället för som fristående filer
FPC använder sina XML-unit:er för XMP; Delphi använder dessutom systemets zlib och Apple ImageIO/CoreGraphics för nativa bildarbetsflöden
Kopiera vald dylib-fil till Macen och ladda den med absolut sökväg för en första integration; länkar man ett program mot dess install name @rpath/libPDFlibDylib.dylib krävs att programmets runpath inkluderar driftsättningskatalogen
Inspektera både filen och dess beroenden på mål-Macen; otool -L listar länkade beroenden, medan leverantörer som läses in vid körning fortfarande kräver platserna ovan
file /path/to/libPDFlibDylib.dylib
otool -D /path/to/libPDFlibDylib.dylib
otool -L /path/to/libPDFlibDylib.dylib
nm -gjU /path/to/libPDFlibDylib.dylib
Skriptet för nativ FPC använder MACOSX_DEPLOYMENT_TARGET för att hålla kompilering och länkning konsistenta; att lägga till ytterligare -macosx_version_min via -k kan välja en oavsiktligt äldre målversion
Länkarens driftsättningsmål är macOS 11.0 för ARM64 och 10.15 för x64; programmets lägsta macOS-version beror också på kompilatorns runtime och installerade leverantörer, så denna flagga etablerar ensamt inte kompatibilitet med alla äldre macOS-versioner
C ABI-typer och symbolnamn
| Pascal-typ | Representation i andra språk |
|---|---|
Integer | 32-bitars heltal med tecken, inklusive instanshandtag och de flesta returkoder |
Int64 | 64-bitars heltal med tecken |
Double | 64-bitars flyttalsvärde |
PWideChar | Pekare till UTF-16-kodenheter, normalt avslutad av en nollkodenhet |
PAnsiChar | Bytepekare; regler för kodning, längd och binärbuffert beror på den specifika funktionen |
Funktioner använder cdecl; slå upp det exporterade namnet, till exempel DLCreateLibrary, med dlsym eller ett gränssnitt för främmande funktioner, utan det inledande understreck som Mach-O-symbolverktygen visar
Deklarera varje argument och returtyp innan anrop; använd pekarbreddstyper för adresser i stället för 32-bitars heltal
macOS wchar_t och Python ctypes.c_wchar_p är UTF-32 och kan därför inte representera detta ABIs PWideChar-parametrar; Python-anropare måste allokera UTF-16-buffertar och behandla returnerad text som en pekare till 16-bitarsenheter
Exportdeklarationerna i Dylib/PDFlibDylib.dpr är auktoritativa för C ABI; metoder som bara finns på Pascal-klassen blir inte automatiskt tillgängliga som DL-exporter
Instanser, strängar och buffertar
- Anropa
DLCreateLibrary()och spara det returnerade positiva 32-bitars instanshandtaget - Skicka det handtaget till åtgärder och kontrollera varje åtgärds dokumenterade returkonvention
- Kopiera returnerad text innan ett annat anrop på samma instans kan skriva över dess returlagring
- Frigör registrerade buffertar med
DLReleaseBuffer(instance, address) - Anropa
DLReleaseLibrary(instance)innan dylib-filen lastas ur
Returnerad text tillhör instansen: frigör den inte med värdens allokator och skicka den inte till DLReleaseBuffer; att frigöra instansen ogiltigförklarar all lånad text och alla utestående buffertar
DLCreateBuffer(instance, length) allokerar en bytebuffert ägd av instansen som kan innehålla inbäddade nollbyte; DLReleaseBuffer returnerar 1 vid lyckat resultat och 0 för en okänd buffert, en buffert från annan instans eller en redan frigjord buffert
DLAddToBuffer kopierar upp till återstående kapacitet och returnerar den återstående kapaciteten, så 0 kan betyda en lyckad full skrivning likaväl som ogiltig indata; det är inte ett booleskt framgångsresultat
Instans 0 är det äldre standardaliaset; uttryckliga positiva handtag gör ägarskapet tydligare och återanvänds inte under det laddade bibliotekets livstid
Serialisera anrop på samma instans, inklusive åtkomst till lånad returlagring; serialisera också instansskapande, frigivning och urladdning mot andra C ABI-anrop, eftersom registrelåset inte skyddar en instans livstid efter uppslagning
Fungerande Python-exempel
Dylib/examples/create_pdf.py binder C ABI med uttryckliga ctypes-signaturer, skapar en riktig PDF med ett standardtypsnitt, läser in den igen, kopierar extraherad UTF-16-text och frigör instansen i ett finally-block
python3 Dylib/examples/create_pdf.py /path/to/libPDFlibDylib.dylib /tmp/hello-dylib.pdf
Exemplet accepterar dylib-filen från någon av kompilatorerna och kontrollerar att den sparade PDF:en behåller sin text; välj den biblioteksarkitektur som matchar Python-processen
Verifiering och felsökning
Kör Python-exemplet ovan med den dylib-fil du planerar att driftsätta; bekräfta att den skapar och läser in PDF:en igen samt returnerar förväntad text
Inspektera dylib-filens arkitektur och beroenden med file och otool -L, och kontrollera de åtgärder ditt program använder mot de nativa förmågegränserna; att en export finns etablerar ensamt inte plattformsstöd för varje åtgärd
| Symptom | Kontroll |
|---|---|
| Saknad macOS-kompilator | Installera den matchande macOS-kompilatorn och kontrollera bdsroot; en Windows-kompilator kan inte producera dylib-filen |
| Saknat eller ogiltigt SDK | Peka på SDK-roten i stället för dess usr/lib-underkatalog och kontrollera den nödvändiga framework-katalogen |
Länkaren avvisar .tbd | Välj den kompatibla Mach-O LLVM-länkaren och kontrollera SDK-versionsmetadata |
| Fel arkitektur vid inläsning | Jämför file-utdata för dylib-filen och värdprocessen; använd x64-Python för x64-byggen och nativ ARM64-Python för ARM64-byggen |
| Saknad leverantör eller symbol | Kontrollera arkitektur, sökväg och version för det nativa beroendet; dynamiskt inlästa leverantörer syns kanske inte i otool -L |
| Förvrängda strängar eller trunkerade adresser | Använd UTF-16-kodenheter och deklarera pekarreturtyper uttryckligen i gränssnittet för främmande funktioner |
| Åtgärd för fönster, skrivare eller Windows device context misslyckas | Använd headless-åtgärder som stöds och se de nativa förmågegränserna |
Se Native Linux and macOS för XMP, rendering, signering/TSA, beroendedetaljer och förmågegränser, inklusive gränser för systemcertifikatlagret och spärrning