ocamlbuild中链接库的顺序

时间:2011-11-28 19:43:02

标签: linker ocaml ocamlbuild

我遇到了将库添加到链接器的顺序问题。 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"]);

1 个答案:

答案 0 :(得分:4)

这不是一个答案,而是一种解决方法 - 使用-cclib -Wl,--no-as-needed禁用此新链接器行为。

我想这应该被报告为螳螂的一个错误。具体来说,ocamlbuild应该保证来自flag的选项以与在源中遇到的顺序相同的顺序插入到命令行中(现在情况就是这样),ocamlopt应该保留命令行中其他条目的-cclib-ccopt参数的顺序(现在不是这种情况)。