linker - ocamlbuild 中链接库的顺序

标签 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"]);

最佳答案

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

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

关于linker - ocamlbuild 中链接库的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8301367/

相关文章:

linker - cygwin 下的 Ocaml + LLVM(或者更一般地说,与 cygwin 下的 C 目标文件静态链接)?

c - 链接到多个共享库,这些共享库都链接到一个公共(public)静态库

c - 用 C 链接到一个特定的库

c++ - 无法删除 Visual Studio 中的链接器错误

list - List.rev 行为奇怪吗?

ocaml - 使用 'ocamlfind install' 设置 Ocaml 库,然后在 ocamlbuild 中使用该库

linux - 链接 : with ld: cannot find -lc

list - 如何将函数仅映射到列表中的某些元素?

ocaml - 如何将 ocamlfind/ocamlbuild 工具链与包的项目本地副本一起使用?

build - 构建和构建 OCaml 项目的首选方式是什么?