1

我正在尝试使用 Buck 交叉编译 Windows 共享库和链接到此共享库的二进制文件。我在以下位置设置工具链路径.buckconfig

[mingw]
  prefix = /usr/local/bin/i686-w64-mingw32

[cxx]
  cc = $(config mingw.prefix)-gcc
  cpp = $(config mingw.prefix)-cpp
  ld = $(config mingw.prefix)-ld
  ar = $(config mingw.prefix)-ar

这是BUCK文件:

cxx_library(
    name = 'bar',
    srcs = ['bar.c'],
    headers = ['bar.h'],
    exported_headers = ['bar.h']
)

cxx_binary(
    name = 'foo',
    srcs = ['foo.c'],
    link_style = 'SHARED'
)

foo.c

#include <stdio.h>
#include "bar.h"

int main(int argc, char *argv[]) {
    bar_init();
    return 0;
}

bar.c

#include <stdio.h>
#include "bar.h"

void bar_init() {
    printf("bar_init successful\n");
}

bar.h

void bar_init();

当我这样做时buck build //:foo,我收到/usr/local/bin/i686-w64-mingw32-ld: unrecognised emulation mode: ap错误(由于-map选项传递给链接器,Mac Os 链接器有它,但 GNU 链接器没有,它有-Map)。

当我添加

archiver_platform = WINDOWS
linker_platform = WINDOWS

.buckconfig,我明白了java.lang.UnsupportedOperationException at com.facebook.buck.cxx.WindowsLinker.origin(WindowsLinker.java:88)。要么不支持,要么WINDOWS意味着 msvc 工具。

.dll是否可以使用 Buck构建 Windows 二进制文件和s?怎么做?(我不想在 Windows 上运行 Buck,用 mingw 或 mingw-w64 交叉编译就可以了)。

更新:我能够通过以下方式使其工作:

  1. 设置(文档linker_platform = GNU.buckconfig没有提到这样的选项,仅在issue中)
  2. 设置ld…-gcc而不是…-ldin .buckconfig。直接调用时ld,不支持gcc前端调用时可用的部分参数。

但是,这不是正确的解决方案:它创建没有扩展名的 PE 文件,动态链接到具有.dylib扩展名的文件。这个可执行文件可以用 Wine 运行,它会加载动态库,但这些设置仍然不正确。

4

0 回答 0