因此,我设法在浏览器中运行了一些简单的webassembly应用程序,我设法从Javascript调用了webassembly代码。但是,当我尝试从C代码调用Javascript时,却无法编译代码
我正在使用clang 9.0和wasi-libc。我如何编译:
clang --target = wasm32-wasi -Wl,-allow-undefined-file = src / wasm.syms -Wl,-export-all --sysroot wasm-test / wasi-libc / sysroot -O2- s -o ./public/main.wasm ./src/main.cpp
src / main.cpp:
#include <stdio.h>
void __console_log(int str, int len);
int main()
{
printf("MAIN!\n");
return 0;
}
extern "C"
{
void test()
{
char *str = "TEST!";
__console_log((int)str, 5);
}
int test2()
{
return 10;
}
}
wasm.syms:
__console_log
如果我删除了cpp文件中对__console_log
的引用,它会起作用,但是,即使在命令行中有--allow-undefined-file=src/wasm.syms
,我也会不断收到链接错误(尝试使用-U = __ console_log,同样的错误):
wasm-ld: error: /var/folders/vl/4bjdkcfx1gncfx0vzrl0s57c0000gn/T/main-a723f9.o: undefined symbol: __console_log(int, int)
使用-v
标志运行时,以下是完整日志:
$ clang --target=wasm32-wasi -Wl,--allow-undefined-file=src/wasm.syms -Wl,--export-all --sysroot /Users/hoff/dev/wasm-test/wasi-libc/sysroot -O2 -s -o ./public/main.wasm ./src/main.cpp -v
clang version 9.0.0 (git://github.com/llvm/llvm-project.git 0399d5a9682b3cef71c653373e38890c63c4c365)
Target: wasm32-unknown-wasi
Thread model: posix
InstalledDir: /Users/hoff/dev/wasm-test/clang/bin
"/Users/hoff/dev/wasm-test/clang/bin/clang-9" -cc1 -triple wasm32-unknown-wasi -emit-obj -disable-free -disable-llvm-verifier -discard-value-names -main-file-name main.cpp -mrelocation-model static -mthread-model posix -masm-verbose -mconstructor-aliases -fuse-init-array -target-cpu generic -fvisibility hidden -dwarf-column-info -debugger-tuning=gdb -target-linker-version 512.4 -momit-leaf-frame-pointer -v -resource-dir /Users/hoff/dev/wasm-test/clang/lib/clang/9.0.0 -isysroot /Users/hoff/dev/wasm-test/wasi-libc/sysroot -internal-isystem /Users/hoff/dev/wasm-test/wasi-libc/sysroot/include/wasm32-wasi/c++/v1 -internal-isystem /Users/hoff/dev/wasm-test/wasi-libc/sysroot/include/c++/v1 -internal-isystem /Users/hoff/dev/wasm-test/clang/lib/clang/9.0.0/include -internal-isystem /Users/hoff/dev/wasm-test/wasi-libc/sysroot/include/wasm32-wasi -internal-isystem /Users/hoff/dev/wasm-test/wasi-libc/sysroot/include -O2 -fdeprecated-macro -fdebug-compilation-dir /Users/hoff/dev/wasm-test -ferror-limit 19 -fmessage-length 102 -fobjc-runtime=gnustep -fcxx-exceptions -fexceptions -fno-common -fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops -vectorize-slp -o /var/folders/vl/4bjdkcfx1gncfx0vzrl0s57c0000gn/T/main-a723f9.o -x c++ ./src/main.cpp
clang -cc1 version 9.0.0 based upon LLVM 9.0.0 default target x86_64-apple-darwin17.6.0
ignoring nonexistent directory "/Users/hoff/dev/wasm-test/wasi-libc/sysroot/include/wasm32-wasi/c++/v1"
ignoring nonexistent directory "/Users/hoff/dev/wasm-test/wasi-libc/sysroot/include/c++/v1"
ignoring nonexistent directory "/Users/hoff/dev/wasm-test/wasi-libc/sysroot/include/wasm32-wasi"
#include "..." search starts here:
#include <...> search starts here:
/Users/hoff/dev/wasm-test/clang/lib/clang/9.0.0/include
/Users/hoff/dev/wasm-test/wasi-libc/sysroot/include
End of search list.
./src/main.cpp:17:21: warning: ISO C++11 does not allow conversion from string literal to 'char *'
[-Wwritable-strings]
char *str = "TEST!";
^
1 warning generated.
"/Users/hoff/dev/wasm-test/clang/bin/wasm-ld" --strip-all -L/Users/hoff/dev/wasm-test/wasi-libc/sysroot/lib/wasm32-wasi /Users/hoff/dev/wasm-test/wasi-libc/sysroot/lib/wasm32-wasi/crt1.o --allow-undefined-file=src/wasm.syms --export-all /var/folders/vl/4bjdkcfx1gncfx0vzrl0s57c0000gn/T/main-a723f9.o -lc /Users/hoff/dev/wasm-test/clang/lib/clang/9.0.0/lib/wasi/libclang_rt.builtins-wasm32.a -o ./public/main.wasm
wasm-ld: error: /var/folders/vl/4bjdkcfx1gncfx0vzrl0s57c0000gn/T/main-a723f9.o: undefined symbol: __console_log(int, int)
clang-9: error: linker command failed with exit code 1 (use -v to see invocation)
感谢您的帮助。
答案 0 :(得分:1)
您还需要将__console_log
声明为外部“ C”。实际上,该提示是错误消息中包含函数签名。 lld在这里要求使用C ++符号(如果不确定,可能会更加清楚,我不确定)。