OCamlBuild中链接库的顺序

6
我在链接器中添加库的顺序出现了问题。之前通过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

在我的ocamlbuild.ml.in文件中。
 if @CC_NOASNEEDED@ then
     flag ["ocaml"; "link"]
         (S [A"-cclib";A"-Wl,--no-as-needed"]);
1个回答

4
这不是一个答案,而是一种解决办法 - 通过 -cclib -Wl,--no-as-needed 禁用这种新的链接器行为。
我猜这应该报告给 mantis 作为一个错误。具体来说, ocamlbuild 应该保证从 flag 中的选项按照在源代码中遇到的顺序插入到命令行中(现在已经是这样了),而 ocamlopt 应该保留与其他条目相对于命令行的顺序相关的 -cclib-ccopt 参数的顺序(现在不是这样的)。

谢谢,这个方法很有效。对于其他遇到这个问题的人,请确保这些标志在所有库之前。 - nlucaroni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接