我遇到了将库添加到链接器的顺序问题。 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
的底部,到顶部。它确实改变了顺序,但从未在ocamlbuild之前创建的构建库(c和其他)之后。
修改的 下面是我在配置脚本和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"]);
答案 0 :(得分:4)
这不是一个答案,而是一种解决方法 - 使用-cclib -Wl,--no-as-needed
禁用此新链接器行为。
我想这应该被报告为螳螂的一个错误。具体来说,ocamlbuild
应该保证来自flag
的选项以与在源中遇到的顺序相同的顺序插入到命令行中(现在情况就是这样),ocamlopt
应该保留命令行中其他条目的-cclib
和-ccopt
参数的顺序(现在不是这种情况)。