【问题标题】:Rebar: Cross Compilation Options钢筋:交叉编译选项
【发布时间】:2015-03-30 08:00:38
【问题描述】:

我正在尝试使用 rebar 在 64 位拱形系统上生成 32 位拱形版本。我不清楚我需要如何修改应用程序的 rebar.config 才能做到这一点。

我查看了 rebar 源代码以了解它们如何检测我的环境:rebar_utils.erl 将架构设置为“x86_64-unknown-linux-gnu”,并且在 rebar_port_compiler 中将其设置为“default_env”。我想知道如何让 rebar 为另一个目标架构进行编译。

我尝试了以下 port_env 选项

{port_env, [{"CFLAGS", "$CFLAGS -fPIC -m32"},{"LDFLAGS", "-arch i386"}]}.

使用这些选项(以及我的路径中的 32 位 Erlang 安装),当我运行 rebar get-deps compile 时,我的依赖项仍在构建为 64 位,因此 ld 跳过了我的32 位库(最终因为找不到 64 位实现而失败)

/usr/bin/ld: skipping incompatible <PATH TO 32-bit erlang install>/lib/erlang/lib/erl_interface-3.7.14/lib/liberl_interface.a when searching for -lerl_interface
/usr/bin/ld: cannot find -lerl_interface
collect2: ld returned 1 exit status
ERROR: sh(cc c_src/epam.o $LDFLAGS -shared  -L"<PATH TO 32-bit erlang install>/lib/erlang/lib/erl_interface-3.7.14/lib" -lerl_interface -lei -o priv/lib/epam.so)

我需要做什么才能强制我的依赖项编译为 32 位?我在这里的尝试不起作用。

【问题讨论】:

    标签: erlang cross-compiling rebar


    【解决方案1】:

    rebar.config 中的port_env 设置可以利用ERLANG_ARCH 环境变量来确定Erlang 运行时是为32 位还是64 位系统构建的。例如,以下port_env 定义将-m32-m64 设置为适用于x86_64、i686 和i386 芯片架构的C 编译器:

    {port_env, [{"x86_64", "CFLAGS", "$CFLAGS -m$ERLANG_ARCH"},
                {"i[36]86", "CFLAGS", "$CFLAGS -m$ERLANG_ARCH"}]}.
    

    每个元组中的第一个字符串是一个正则表达式,它与erlang:system_info(system_architecture) function 返回的 Erlang 运行时的系统架构字符串相匹配。在这个例子中,额外的-m$ERLANG_ARCH 选项仅在正则表达式匹配时添加,所有其他架构都获得默认的CFLAGS 设置。

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 1970-01-01
      • 2013-02-09
      • 2015-01-26
      • 2014-12-17
      • 2016-01-29
      • 2016-08-05
      • 2013-12-08
      • 2019-03-02
      相关资源
      最近更新 更多