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"]);
Grazie, ha funzionato alla grande. Per chiunque altro abbia il problema, assicurati che questi flag siano prima di tutte le librerie. – nlucaroni
http://caml.inria.fr/mantis/view.php?id=5441 – ygrek