我正在尝试使用 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 交叉编译就可以了)。
更新:我能够通过以下方式使其工作:
- 设置(文档
linker_platform = GNU
中.buckconfig
没有提到这样的选项,仅在issue中) - 设置
ld
为…-gcc
而不是…-ld
in.buckconfig
。直接调用时ld
,不支持gcc
前端调用时可用的部分参数。
但是,这不是正确的解决方案:它创建没有扩展名的 PE 文件,动态链接到具有.dylib
扩展名的文件。这个可执行文件可以用 Wine 运行,它会加载动态库,但这些设置仍然不正确。