2011-11-28 18 views
6

Ho riscontrato un problema con l'ordine in cui le librerie vengono aggiunte al linker. Le librerie create in precedenza da ocamlbuild sono collegate dopo l'elenco di librerie che ho incluso nella regola flag. E, non vedo alcun modo per definire questo tipo di dipendenza in myocamlbuild.ml.Ordine di librerie collegate in ocamlbuild

In particolare, il problema si presenta in collegamento con una libreria precedentemente costruita (gzcaml) che richiede una libreria stessa (z). A causa del rigore aggiunto nelle versioni più recenti di gcc, l'argomento -lz deve essere visualizzato dopo libgzcaml.a.

Sono compresi tutti questi biblioteche con,

flag ["ocaml"; "link"] 
    (S (process "-cclib" clibs)) 

dove process crea una lista alternando la biblioteca e A"-cclib", in modo appropriato.

Inoltre, vengono aggiunte ulteriori librerie (dall'output dettagliato, -lm e -ldl) ma non ho idea di come sia possibile modificarle/aggiungerle? (questo risolverebbe istantaneamente il mio problema).

Il mio myocamlbuild.ml è piuttosto lungo altrimenti lo avrei incluso qui. Ho provato a spostare il codice sopra in fondo alla After_rules, verso l'alto. E cambia l'ordine, ma mai dopo le librerie compilate (c e altro) che ocamlbuild ha creato in precedenza.


EDIT Qui di seguito sono frammenti di codice che ho usato nel mio script di configurazione e ocamlbuild per risolvere il problema di cui sopra. Saluti!

in configure.ac

oCFLAGS="$CFLAGS" 
CFLAGS="$FLAGS -Wl,--no-as-needed" 
AC_MSG_CHECKING([whether we need to add --no-as-needed linking option]) 
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], 
            [[ 
             int main(){ return 0; } 
            ]])], 
        [AC_MSG_RESULT([yes]); CC_NOASNEEDED="true"], 
        [AC_MSG_RESULT([no]); CC_NOASNEEDED="false"]) 
CFLAGS=$oCFLAGS 

in myocamlbuild.ml.in

if @[email protected] then 
    flag ["ocaml"; "link"] 
     (S [A"-cclib";A"-Wl,--no-as-needed"]); 

risposta

4

Questa non è una risposta, ma una soluzione - disattivare questo nuovo comportamento del linker con -cclib -Wl,--no-as-needed.

Immagino che questo dovrebbe essere segnalato come un bug alla mantide. Nello specifico, ocamlbuild dovrebbe garantire che le opzioni da flag s vengano inserite nella riga di comando nello stesso ordine in cui si incontrano nell'origine (questo è il caso ora) e ocamlopt deve conservare l'ordine degli argomenti -cclib e -ccopt in altre voci sulla riga di comando (questo NON è il caso ora).

+0

Grazie, ha funzionato alla grande. Per chiunque altro abbia il problema, assicurati che questi flag siano prima di tutte le librerie. – nlucaroni

+2

http://caml.inria.fr/mantis/view.php?id=5441 – ygrek

Problemi correlati