我在这里举了一个完整的例子,我不知道这是不是正确的方法! 完善:
emcc jquery001.cpp -o jquery001.js -s EXPORTED_FUNCTIONS="['_x_click','_webmain']"
似乎一切都很好,程序运行良好,但... printf
显示总是不是最后一个printf而是prev
初始输出:
pre-main prep time: 11 ms
jquery001.js:143
jquery001.js:143 enter webmain
jquery001.js:143 webmain <>
退出网站主页是missig:printf(&#34; \ n退出webmain&#34;);
然后点击&#39;在元素示例上显示:exit webmain
jquery001.js:143 enter x_click
jquery001.js:143 x_click event <x1>
printf退出web主...但不是printf(&#34; \ n退出x_click&#34;);
出了什么问题?
[jquery001.html]
<!DOCTYPE html>
<html>
<head>
<title>emcc & jquery</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>
<body>
<label id="x1" class="x" >emscripten1</label>
<label id="x2" class="x" >emscripten2</label>
</body>
<script src="jquery001.js"></script>
<script>
Module.ccall('webmain', 'number', ['string'],['']);
</script>
</html>
[jquery001.cpp]
#include <stdio.h>
#include <stdlib.h>
#include <emscripten.h>
#include <string.h>
#include <string>
extern "C"
{
int x_click( char *s )
{
printf ( "\n enter x_click");
printf ( "\n x_click event <%s>",s );
printf ( "\n exit x_click");
return 0 ;
}
int webmain( char *s )
{
printf ( "\n enter webmain");
printf ( "\n webmain <%s>",s);
int x = EM_ASM_INT({
$('.x').click(function(e)
{
Module.ccall('x_click', 'number', ['string'],[e.target.id]);
});
return 0;
}, NULL);
printf ( "\n exit webmain");
return 0 ;
}
}
int main ( void )
{
return 0 ;
}
答案 0 :(得分:1)
Emscripten通过缓冲传递给printf
的参数来处理输出,直到它到达换行符,此时该字符串被传递给Module.print()
方法,该方法处理显示输出。这样做的结果是,如果将一个字符串传递给printf
并且不以换行符结尾,那么它就不会被打印出来。
这类似于stdout
在C中的缓冲方式,但与Emscripten(至少我测试过的版本1.36)的区别在于调用fflush(NULL)
不会刷新缓冲区,{ {1}}的缓冲方式与stderr
相同。
纠正你的问题很简单,你只需要通过在最终字符串末尾添加换行符来刷新缓冲区,即:
stdout
和
printf("\n exit x_click\n");