2010-01-04 17 views
29

Ho una libreria C, che costruisco come un oggetto condiviso per Linux e una DLL per Windows con MinGW32. L'API dipende da un paio di file di dati (modelli statistici) che mi piacerebbe davvero lanciare con SO/DLL in modo che la distribuzione sia solo un file.Esiste un equivalente Linux dei "file di risorse" di Windows?

Sembra che posso ottenere questo per Windows con un "file di risorse" compilato con windres, ma poi devo scrivere un sacco di codice di gestione delle risorse per Windows, e sono ancora bloccato con i file su Linux.

C'è un modo per ottenere la stessa funzionalità su Linux?

Ancora meglio, esiste una soluzione portatile?

+1

Simile (possibile dup): http://stackoverflow.com/questions/1656968/platform-independant-resource-management e possibilmente altro, ma è un argomento difficile da cercare ... – dmckee

+0

Non votare per chiudere, anche se , la risposta alla domanda esistente è solo marginalmente utile. – dmckee

+0

Sarebbe di grande aiuto se tu ci dicessi quale codice (portatile) vuoi scrivere per ottenere l'accesso ai file di dati. 'fopen' e' fread' semplicemente non funzioneranno su blocchi di memoria, almeno non su qualsiasi sistema di cui sono a conoscenza. –

risposta

27

In realtà è abbastanza semplice su altri sistemi Linux e ELF: http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967

OS X ha bundle, quindi basta costruire la vostra biblioteca come un quadro e mettere il file nel pacchetto.

+0

Questo approccio funziona anche per la creazione di DLL di Windows? Sembra una buona, semplice opzione. – cibyr

+0

Non ho idea, non ho mai creato nulla per Windows e non so nulla su come funziona il linker. –

+0

Rimane ancora il problema che l'API per l'accesso ai dati in un file è diversa dall'API per l'accesso a un blocco denominato in memoria. Ma se riesci a conviverci, non hai bisogno di "objcopy"; puoi facilmente scrivere un breve script che genera un file .c da qualsiasi file binario. Ad esempio, http://www.cs.tufts.edu/~nr/drop/lua/lua2c; esegui lo script con l'opzione -s. –

0

due possibili soluzioni: biblioteca sfio di

  • Phong Vo, che fa parte della AT & T avanzata Software Technology set di strumenti, è un meraviglioso sostituto di C stdio.h, e permetterà di aprire sia i file o blocchi di memoria che utilizzano una singola API. In questo modo è possibile convertire facilmente i file esistenti in dati inizializzati C da includere nel file DLL o SO.

    Questa è una buona soluzione multipiattaforma, ma la penalità è che la curva di apprendimento per iniziare è piuttosto alta. Non rendono facile capire come funzionano le cose o prendere una parte del loro set di strumenti e dividerle per l'uso indipendente dalle altre parti. Ma la buona notizia è che se si desidera adottare il proprio sistema U/Win per l'esecuzione di codici Unix su Windows (tutti parte dello stesso set di strumenti), è possibile creare DLL e SO utilizzando lo stesso sistema.

  • Per questo tipo di problema, faccio spesso ricorso a Lua; Posso memorizzare i dati Lua in file esterni o in C come dati inizializzati. Questo è ottimo per distribuire tutto in un file .so; Lo faccio per i miei studenti.

    Ancora una volta il lato negativo è che devi padroneggiare e incorporare una nuova tecnologia.

Nel mio lavoro io uso Lua sopra la T roba a & per questi motivi:

  • Lua ha una molto più piccola ormaed è progettato per giocare bene con gli altri; con AST hai davvero adottato il loro modo di fare le cose.

  • La curva di apprendimento con Lua è molto meno ripida; puoi essere produttivo molto rapidamente.

  • Lua è facile da installare ed è facile ottenere informazioni a riguardo. AST ha il suo peculiare processo di installazione condiviso da nessun altro al mondo; è spesso difficile far funzionare l'installazione; ed è più difficile ottenere informazioni a riguardo.

  • Utilizzo di Lua ha molti altri profitti, quindi lo sforzo speso per imparare Lua e imparare come incorporare Lua in codici C è facile da ammortizzare su più progetti.

+0

Non vedo come l'incorporamento di un linguaggio di scripting risolva il problema dell'inclusione di dati di file arbitrari, e se avessi intenzione di incorporare un linguaggio di scripting probabilmente andrei con Python (dato che ho usato Boost.Python molto recentemente comunque). sfio sembra a portata di mano, ma sembra che probabilmente non varrebbe la pena refactoring tutto il suo utilizzo. – cibyr

+0

@cibyr: Il mio asnwer si basa su cosa incorporare, non come incorporarlo. Come incorporare un file come codice C è molto, molto facile; tutto il pensiero passa alla domanda su quale API si desidera per i byte. Se guardi in http://www.cs.tufts.edu/~nr/drop/lua vedrai uno script chiamato 'lua2c' che potrebbe darti qualche idea. Esegui con l'opzione '-s' e incorpora qualsiasi file binario, sebbene non sia molto utile dato che l'API che ho generato tenta di compilare il file come codice Lua. Ma una volta che decidi quale API vuoi, sono sicuro che puoi fare qualcosa in Python. In caso contrario, pubblica un'altra domanda. –

+4

Non sono sicuro di come questo remoto si avvicini a rispondere alla domanda OP che "c'è un modo per aggiungere file di risorse con il mio eseguibile" (la mia interpretazione). Finora la strada dell'objopia sembra molto più ragionevole dell'inclusione di lua. –

Problemi correlati