使用 emscripten 找不到 Windows.h
Posted
技术标签:
【中文标题】使用 emscripten 找不到 Windows.h【英文标题】:Windows.h not found using emscripten 【发布时间】:2013-04-02 19:59:28 【问题描述】:我正在尝试在 Windows 上使用 Emscripten 在 javascript 中转换 C 库。我使用教程 here 来设置 emscripten 和 LLVM/Clang 以开始使用。我用Visual Studio 2010编译LLVM。clang的版本是:
clang 3.2 版(标签/RELEASE_32/final) 目标:i686-pc-win32 线程模型:posix
在命令行上,我写了这一行来编译我的文件:
C:\emscripten>python emcc -v \mypath\myfile.c
这是我得到的输出和最终的错误(以及我寻求帮助的原因......)
emcc: compiling to bitcode
emcc: compiling source file: \mypath\myfile.c
emcc running: C:\llvm\build\bin\release\clang -m32 -U__i386__ -U__x86_64__ -U__i
386 -U__x86_64 -Ui386 -Ux86_64 -U__SSE__ -U__SSE2__ -U__MMX__ -UX87_DOUBLE_ROUND
ING -UHAVE_GCC_ASM_FOR_X87 -DEMSCRIPTEN -U__STRICT_ANSI__ -U__CYGWIN__ -D__STDC_
_ -Xclang -triple=i386-pc-linux-gnu -D__IEEE_LITTLE_ENDIAN -fno-math-errno -fno-
ms-compatibility -nostdinc -Xclang -nobuiltininc -Xclang -nostdsysteminc -Xclang
-isystemC:\emscripten\system\local\include -Xclang -isystemC:\emscripten\system
\include\libcxx -Xclang -isystemC:\emscripten\system\include -Xclang -isystemC:\
emscripten\system\include\emscripten -Xclang -isystemC:\emscripten\system\includ
e\bsd -Xclang -isystemC:\emscripten\system\include\libc -Xclang -isystemC:\emscr
ipten\system\lib\libcxxabi\include -Xclang -isystemC:\emscripten\system\include\
gfx -Xclang -isystemC:\emscripten\system\include\net -Xclang -isystemC:\emscript
en\system\include\SDL -U__APPLE__ -U__linux__ -D_LIBCPP_HAS_NO_DELETED_FUNCTIONS
-v -emit-llvm -c \mypath\myfile.c -o C:\tempo\tmpn8yiq5\myfile_0.o
clang version 3.2 (tags/RELEASE_32/final)
Target: i686-pc-win32
Thread model: posix
"C:/llvm/build/bin/release/clang.exe" -cc1 -triple i686-pc-win32 -emit-llvm-bc
-disable-free -disable-llvm-verifier -main-file-name myfile.c -mrelocation-mod
el static -mdisable-fp-elim -masm-verbose -mconstructor-aliases -target-cpu pent
ium4 -momit-leaf-frame-pointer -v -coverage-file "C:\\tempo\\tmpn8yiq5\\myfile_0
.o" -nostdsysteminc -nobuiltininc -resource-dir "C:/llvm/build/bin/release\\..
\\lib\\clang\\3.2" -U __i386__ -U __x86_64__ -U __i386 -U __x86_64 -U i386 -U x8
6_64 -U __SSE__ -U __SSE2__ -U __MMX__ -U X87_DOUBLE_ROUNDING -U HAVE_GCC_ASM_FO
R_X87 -D EMSCRIPTEN -U __STRICT_ANSI__ -U __CYGWIN__ -D __STDC__ -D __IEEE_LITTL
E_ENDIAN -U __APPLE__ -U __linux__ -D _LIBCPP_HAS_NO_DELETED_FUNCTIONS -fmodule-
cache-path "C:\\Users\\SS\\AppData\\Local\\Temp\\clang-module-cache" -ferror-lim
it 19 -fmessage-length 80 -mstackrealign -fms-extensions -fmsc-version=1300 -fde
layed-template-parsing -fobjc-runtime=gcc -fobjc-default-synthesize-properties -
fdiagnostics-show-option -fcolor-diagnostics -triple=i386-pc-linux-gnu -nobuilti
ninc -nostdsysteminc "-isystemC:\\emscripten\\system\\local\\include" "-isystemC
:\\emscripten\\system\\include\\libcxx" "-isystemC:\\emscripten\\system\\include
" "-isystemC:\\emscripten\\system\\include\\emscripten" "-isystemC:\\emscripten\
\system\\include\\bsd" "-isystemC:\\emscripten\\system\\include\\libc" "-isystem
C:\\emscripten\\system\\lib\\libcxxabi\\include" "-isystemC:\\emscripten\\system
\\include\\gfx" "-isystemC:\\emscripten\\system\\include\\net" "-isystemC:\\emsc
ripten\\system\\include\\SDL" -o "C:\\tempo\\tmpn8yiq5\\myfile_0.o" -x c "\\mypa
th\\myfile.c"
clang -cc1 version 3.2 based upon LLVM 3.2svn default target i686-pc-win32
ignoring nonexistent directory "C:\emscripten\system\local\include"
#include "..." search starts here:
#include <...> search starts here:
C:\emscripten\system\include\libcxx
C:\emscripten\system\include
C:\emscripten\system\include\emscripten
C:\emscripten\system\include\bsd
C:\emscripten\system\include\libc
C:\emscripten\system\lib\libcxxabi\include
C:\emscripten\system\include\gfx
C:\emscripten\system\include\net
C:\emscripten\system\include\SDL
End of search list.
\mypath\myfile.c:4:10: fatal error: 'windows.h'
file not found
#include <windows.h>
^
1 error generated.
emcc: compiler frontend failed to generate LLVM bitcode, halting
C 文件不使用任何 MFC,据我了解,clang 3.2 版应该能够使用标准的 windows API。我检查了是否可以找到 Windows.h,它位于 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include
我是否遗漏了某些内容,例如指定我正在使用 Win32 编译的配置或标志?我还注意到,在 llvm 存储库中,有一个位于 lib/Support/Windows 中的 Windows.h 文件,但我不知道它的用途是什么。这看起来像是某种可移植性包装器,可以使用来自不同库的标准 C++。
我不知道从那里去哪里,如果有任何帮助,我们将不胜感激。
【问题讨论】:
你的编译行不应该有“-I C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Include”吗? 我一开始也是这么想的,但是由于emcc是用来交叉编译的,所以它使用了与Emscripten捆绑的系统头文件。在 Emscripten 教程中,它指定:“要注意的一件事是,如果您构建一个包含硬编码的项目,例如 -I/usr/include/something:当您交叉时,以这种方式使用系统标头是危险的- 编译,因为标头用于您的本地系统,而不是您实际构建的平台。” 我不认为 emscripten 带有 WinAPI 实现 - 它不是 default distribution 的一部分,我不确定它是否会很快发生:基本上,你需要移植 WINE ... @SimonSenécal 对此有何更新? 【参考方案1】:Emscripten 没有所需的 Javascript 文件端口,例如 windows.h
或 OSX 的 Cocoa。
唯一的解决方案是将您的代码移植到 SDL,因为 SDL 在 emscripten 中可用,因此在其标头中可用。
【讨论】:
以上是关于使用 emscripten 找不到 Windows.h的主要内容,如果未能解决你的问题,请参考以下文章
Emscripten:致命错误:找不到“tr1/unordered_map”文件