У меня проблема с порядком добавления библиотек в компоновщик. Библиотеки, ранее собранные ocamlbuild, подключаются после списка библиотек, которые я включил по правилу flag
. И я не вижу никакого способа определить этот тип зависимости в myocamlbuild.ml
.
В частности, проблема возникает при компоновке с ранее собранной библиотекой (gzcaml
), которая сама требует библиотеки (z
). Из-за дополнительной строгости в новых версиях gcc аргумент -lz
должен появляться после libgzcaml.a
.
Я включаю все эти библиотеки с,
flag ["ocaml"; "link"]
(S (process "-cclib" clibs))
где process
создает список, чередующий библиотеку и A"-cclib"
, соответствующим образом.
Кроме того, добавляются дополнительные библиотеки (судя по вербозному выводу, -lm
и -ldl
), но я понятия не имею, как я могу изменить/добавить их? (это мгновенно решило бы мою проблему).
Мой myocamlbuild.ml
довольно длинный, иначе я бы включил его сюда. Я попробовал переместить вышеупомянутый код из нижней части After_rules
в верхнюю. И это действительно меняет порядок, но никогда после собранных библиотек (c и других), которые ocamlbuild создал ранее.
EDIT. Ниже приведены фрагменты кода, которые я использовал в скрипте configure и ocamlbuild для решения вышеуказанной проблемы. Будьте здоровы!
в 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
в myocamlbuild.ml.in
if @CC_NOASNEEDED@ then
flag ["ocaml"; "link"]
(S [A"-cclib";A"-Wl,--no-as-needed"]);