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 variabelBetydelse
37.0RAD Studio-registerversion som ska hittas när en rotsökväg inte anges; standardvärdet är 37.0
osxarm64 / osx64Väljer dccosxarm64.exe eller dccosx64.exe; det befintliga standardvärdet är osx64, så ange ARM64 uttryckligen för Apple silicon
debugAktiverar 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_LINKERValfri absolut sökväg till Mach-O-länkaren; ta bort den för att använda kompilatorns standardlänkare
PDFLIBPAS_DYLIB_CONFIGVä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

KompilatorFULL ReleaseFULL DebugTRIAL ReleaseTRIAL Debug
Delphi ARM64Dylib/OSXARM64/ReleaseDylib/OSXARM64/DebugDylib/OSXARM64/Release-TRIALDylib/OSXARM64/Debug-TRIAL
FPC ARM64Dylib/OSXARM64/FPC-release-fullDylib/OSXARM64/FPC-debug-fullDylib/OSXARM64/FPC-release-trialDylib/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

ProviderStandardplats för ARM64Används för
OpenSSL 3/opt/homebrew/opt/openssl@3/lib/libcrypto.3.dylibNativ kryptering, hashning, PFX/CMS-signering och verifiering
Cairo/opt/homebrew/lib/libcairo.2.dylibNativ bitmappsrendering
Fontconfig/opt/homebrew/lib/libfontconfig.1.dylibNativ typsnittssökning
OpenJPEG/opt/homebrew/lib/libopenjp2.7.dylibJPEG 2000
libcurl/usr/lib/libcurl.4.dylibHTTP/HTTPS, intervallåtkomst och TSA-transport
libxml2/usr/lib/libxml2.2.dylibDelphi 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-typRepresentation i andra språk
Integer32-bitars heltal med tecken, inklusive instanshandtag och de flesta returkoder
Int6464-bitars heltal med tecken
Double64-bitars flyttalsvärde
PWideCharPekare till UTF-16-kodenheter, normalt avslutad av en nollkodenhet
PAnsiCharBytepekare; 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

  1. Anropa DLCreateLibrary() och spara det returnerade positiva 32-bitars instanshandtaget
  2. Skicka det handtaget till åtgärder och kontrollera varje åtgärds dokumenterade returkonvention
  3. Kopiera returnerad text innan ett annat anrop på samma instans kan skriva över dess returlagring
  4. Frigör registrerade buffertar med DLReleaseBuffer(instance, address)
  5. 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

SymptomKontroll
Saknad macOS-kompilatorInstallera den matchande macOS-kompilatorn och kontrollera bdsroot; en Windows-kompilator kan inte producera dylib-filen
Saknat eller ogiltigt SDKPeka på SDK-roten i stället för dess usr/lib-underkatalog och kontrollera den nödvändiga framework-katalogen
Länkaren avvisar .tbdVälj den kompatibla Mach-O LLVM-länkaren och kontrollera SDK-versionsmetadata
Fel arkitektur vid inläsningJä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 symbolKontrollera 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 adresserAnvä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 misslyckasAnvä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

Referensindex