2013-07-02 21 views
7

Bazı OS API'leriyle konuşmak için Windows'da bir özel .dll ve .lib gerektiren bir Haskell kitaplık paketi üzerinde çalışıyorum. .lib kütüphaneye extra-libraries alanı ile bağlanır ve DLL, data-files ile cabal paket dizinine yüklenir.Statik .lib kütüphane kullanıcıları için de gereklidir?

Nedense (build-depends alanında) paketimi kullanan bir sınama yürütülebilir dosyası oluşturursam, aynı şekilde bağlantı kurmak istiyorsa (herhangi bir şekilde bağlantı kurma konusunda uzman değilim, ancak bu garip görünüyor). lib kütüphaneyi derlerdi - kütüphane işlevlerini çağırıyor olsa da, .lib'nin gösterdiği hiçbir şey değil. Açıkçası, çalışma zamanında .dll erişim gerekir, ancak beklenen. .lib'ye ihtiyaç duyulması garip görünüyor.

Yüklendiğinde, kitaplığım için .lib dosyasının Cabal/GHC tarafından oluşturulan .a dosyasına zaten bağlanmasını beklerim. Durum böyle değil mi? Ve eğer öyleyse, biri neden böyle olduğunu açıklayabilir mi?

cevap

1

Kısmi bağlantı istediğiniz gibi görünüyor (ld kılavuz sayfasındaki --relocatable işaretine bakın). Kaynaklardan görebildiğim gibi, cabal sadece ghci için derlenmiş olan kısmi bağlantı kütüphanelerini kullanır. Distribution.Simple.GHC (buildLib fonksiyonu) Gönderen:

whenVanillaLib False $ do 
    (arProg, _) <- requireProgram verbosity arProgram (withPrograms lbi) 
    Ar.createArLibArchive verbosity arProg 
    vanillaLibFilePath staticObjectFiles 

whenProfLib $ do 
    (arProg, _) <- requireProgram verbosity arProgram (withPrograms lbi) 
    Ar.createArLibArchive verbosity arProg 
    profileLibFilePath profObjectFiles 

whenGHCiLib $ do 
    (ldProg, _) <- requireProgram verbosity ldProgram (withPrograms lbi) 
    Ld.combineObjectFiles verbosity ldProg 
    ghciLibFilePath ghciObjFiles 

whenSharedLib False $ 
    runGhcProg ghcSharedLinkArgs 

Sen vanilya ve profil kütüphaneler için, cabal sadece ar programını (createArLibArchive bakınız) çağırır görebilirsiniz. ghci için, -r bayrağıyla ld numarasını çağırır (bu, --relocatable için bir kısayoldur) (bkz. combineObjectFiles).

Yani, cabal aslında vanilya kitaplıkları için herhangi bir bağlantı yapmaz, yalnızca nesne dosyalarını birleştirir. Aslında, cabal aslında, final uygulamasının extra-lib'unuzdan herhangi bir sembolü kullanıp kullanamayacağını bilemez, bu nedenle davranış makul görünüyor.

+0

Vanilya kütüphaneleri için 'ar' yerine' ld -r' kullanmak için onu zorlamak için bir yol var mı? Ld-options: -r 'yi eklemeyi denedim ama hiçbir şey yapmıyor gibi görünüyor (muhtemelen' ld 'kullanılmıyor mu?) –

+0

@TomSavage Hayır, bence mümkün değil. Ama ben kabile konusunda uzman değilim. – Yuras