如何将共享cxx_library与cxx_binary链接到Buck中的mingw编译器?

时间:2017-08-03 22:59:51

标签: mingw buck

我正在尝试使用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链接器没有,它有{{{ 1}})。

当我添加

-Map

archiver_platform = WINDOWS linker_platform = WINDOWS ,我得到.buckconfig java.lang.UnsupportedOperationException。要么不支持,要么at com.facebook.buck.cxx.WindowsLinker.origin(WindowsLinker.java:88)表示msvc工具。

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

更新:我能够通过以下方式使其发挥作用:

  1. .dll中设置linker_platform = GNUdocs中没有提到这样的选项,仅在issue中)
  2. .buckconfig中将ld设为…-gcc而不是…-ld。直接调用.buckconfig时,它不支持通过ld前端调用时可用的某些参数。
  3. 但是,这不是正确的解决方案:它创建没有扩展名的PE文件动态链接到具有gcc扩展名的文件。此可执行文件可以使用Wine运行,并且它会加载动态库,但这些设置仍然不正确。

0 个答案:

没有答案