我在链接器中添加库的顺序出现了问题。之前通过ocamlbuild构建的库被链接到了我通过
具体来说,在链接之前,我需要与先前构建的库 (
我正在使用以下代码包括所有这些库:
在我的ocamlbuild.ml.in文件中。
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"]);