含C/C++文件的Emscripten编译报错:-std=c++11不适用于C/ObjC
解决方案:Emscripten混合编译C++和C文件时的
-std=c++11报错问题 这个错误其实很好理解——你给整个编译命令加了-std=c++11,但这个参数是给C代码用的,Emscripten会把它套用到所有输入文件上,包括你的C文件file2.c,而C编译器根本不认识C的标准参数,自然就报错了。下面给你两种实用的解决办法:
方法一:分步骤编译为目标文件再链接
把C++和C文件分开编译成目标文件(.o),分别指定对应语言的编译参数,最后再链接到一起:
- 编译C文件(指定C11标准):
emcc -c -std=c++11 -O2 file1.cpp -o file1.o - 编译C文件(不需要C++标准参数):
emcc -c -O2 file2.c -o file2.o - 链接所有目标文件并生成最终产物:
emcc -s WASM=1 -o output.html -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall', 'cwrap', 'Pointer_stringify']" -s ASSERTIONS=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=1 file1.o file2.o
这里的-c参数是告诉编译器只编译不链接,这样就能给不同类型的文件单独设置编译规则了。另外提一句:你原来命令里同时写了-O1 -O2 -O3,这没必要,优化级别选最高的那个就行(比如-O3),多个优化参数只会生效最后一个。
方法二:在同一个命令里显式指定文件语言类型
用Emscripten的-x参数,在每个文件前显式声明它的语言类型,这样就能在一条命令里给不同文件分配对应的编译参数:
emcc -s WASM=1 -o output.html -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall', 'cwrap', 'Pointer_stringify']" -s ASSERTIONS=1 -O2 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=1 -x c++ -std=c++11 file1.cpp -x c file2.c
解释一下:
-x c++告诉编译器,接下来的file1.cpp是C++文件,所以后面的-std=c++11会生效;-x c切换回C语言模式,处理file2.c时就不会带上C++的标准参数了。
这两种方法都能完美解决你的问题,选哪种全看你个人习惯——分步骤编译更清晰,适合文件多的项目;单命令编译更简洁,适合小项目。
内容的提问来源于stack exchange,提问作者J. Douglas
相关产品推荐
相关产品推荐

