编译项目时,我得到大约20个与TBB库有关的错误。当我使用VS2015编译项目时,我没有收到任何错误。关于Emsctipten它看起来像这样。这可能是什么?非常感谢你的帮助。
// WITH EMCC
// C:/Users/Admin/Documents/EMC/OpenFace>emcc FaceLandmarkVid.cpp -o OpenFace.js
// C:/Users/Admin/Documents/EMC/OpenFace/3rdParty/tbb/include/tbb/tbb_machine.h:332:6: // error: Unsupported
// machine word size.
// #error Unsupported machine word size.
// Code from tbb_machine.h Line: 328 - 333 //
// #define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp8(P,V,C)
// #define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchadd8(P,V)
// #define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstore8(P,V)
//#else /* __TBB_WORDSIZE != 8 */
// #error Unsupported machine word size.
//#endif /* __TBB_WORDSIZE */
// 20 errors generated.
// WITH CLANG //
// C:/Users/Admin/Documents/EMC/OpenFace>clang++ FaceLandmarkVid.cpp -o OpenFace.js
// C:/Users/Admin/Documents/EMC/OpenFace/3rdParty/tbb/include/tbb/internal
// /_tbb_windef.h:32:2: error: TBB
// requires linkage with multithreaded C/C++ runtime library. Choose multithreaded // DLL runtime in project
// settings, or use /MD[d] compiler switch.
// #error TBB requires linkage with multithreaded C/C++ runtime library. \
// 28 warnings and 1 error generated.

答案 0 :(得分:2)
您好我没有在我的机器上测试过这个,但您需要查看更广泛的背景(查看来自https://github.com/jckarter/tbb/blob/master/include/tbb/tbb_machine.h#L285的TTB代码):
#if __TBB_WORDSIZE==4
#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp4(P,V,C)
#define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchadd4(P,V)
#define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstore4(P,V)
#elif __TBB_WORDSIZE==8
#if __TBB_USE_GENERIC_DWORD_LOAD_STORE || __TBB_USE_GENERIC_DWORD_FETCH_ADD || __TBB_USE_GENERIC_DWORD_FETCH_STORE
#error These macros should only be used on 32-bit platforms.
#endif
#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp8(P,V,C)
#define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchadd8(P,V)
#define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstore8(P,V)
#else /* __TBB_WORDSIZE != 8 */
#error Unsupported machine word size.
#endif /* __TBB_WORDSIZE */
TTB github目录中的快速搜索显示此文件(https://github.com/jckarter/tbb/blob/0343100743d23f707a9001bc331988a31778c9f4/include/tbb/tbb_machine.h#L78):
Prerequisites for each architecture port
----------------------------------------
The following functions and macros have no generic implementation. Therefore they must be
implemented in each machine architecture specific header either as a conventional
function or as a functional macro.
__TBB_WORDSIZE
This is the size of machine word in bytes, i.e. for 32 bit systems it
should be defined to 4.
所以我的猜测是,在没有投入太多时间的情况下,在TTB的某处,有一些特定于平台的代码可以设置适合该平台的 __ TBB_WORDSIZE 的值...
因此,对于Emscripten,您可以在代码中添加以下代码段:
#ifdef __EMSCRIPTEN__
#define __TBB_WORDSIZE 4
#endif
这可以帮助您完成下一个编译错误。祝你好运!
你需要意识到的是,Cpp主要是可移植的,但任何处理低级细节的代码都需要特定于平台的实现细节(这可能很明显,但它也可能对未来的读者有帮助)。理想情况下,特定于平台的代码保持在最低限度并且集中在一个地方。
预处理器变量用于检测用于编译代码的架构/编译器以及定义某些特定于平台的详细信息。在TTB中,典型的平台检测预处理器变量为#if __MINGW64__ || __MINGW32__
,#elif _XBOX
,#elif __linux__ || __FreeBSD__ || __NetBSD__
,一些示例平台特定的详细信息为TBB_USE_GCC_BUILTINS
,__TBB_WORDSIZE
,{ {1}} ...
回到TTB,快速搜索显示平台抽象层位于 tbb_machine.h 中,您应该阅读文件顶部的注释,可在此处找到:https://github.com/jckarter/tbb/blob/0343100743d23f707a9001bc331988a31778c9f4/include/tbb/tbb_machine.h#L32 < / p>
确保您了解每个架构端口的先决条件部分。在本节中,您将了解到需要定义多个宏,并且列表中的第一个是__TBB_Yield()
,__TBB_WORDSIZE
,__TBB_Yield()
等等。
最后,文件夹 tbb / include / tbb / machine / 包含几个特定于平台的头文件(gcc,mac,xbox ...)。您很可能也需要为emscripten创建一个。当你这样做时,请记住它是使用Clang编译的(与gcc兼容)并使用32位架构。
Fork Github上的存储库。创建一个Emscripten分支并使其工作(或至少尽可能远)。使用Emscripten更新自述文件以及构建的确切说明。
当你被困住时,请在此处提出另一个问题。但这一次,链接到您的github存储库。如果在我的机器上重现错误需要2分钟,我更有可能尝试并为您修复一些错误。
即使您没有成功完全移植它,您的努力也将公开发布,而其他人可能会在其上建立。
如果你设法完成它,那就做得好!你现在是一个开源贡献者 下一步是打开拉取请求以将其合并回主TTB存储库。然后,您的补丁将由英特尔的一些经验丰富的工程师进行审核,他们会指出您的代码/方法中的潜在问题,并且您将通过这样做了解很多。
顺便说一下,将这个贡献给主图书馆也对你的雇主有利。一旦它合并到主存储库中,它们将随着库的发展而维护该端口。其他人更有可能使用它并改进它。
最后,在几年内你可能想要换工作并进行一些面试。当询问你的经验和能力时,以下几点可以帮助你脱颖而出:
3年前,我将英特尔TTB的库移植到了Emscripten。这比我原先预想的要难,但我最终使它成功了。然后由英特尔的2位高级工程师审核该补丁,并在代码审查后将其整合到库中。反馈令人羞愧,但它帮助我内化了我今天仍在使用的最佳实践,并有助于提高我的工作质量。
我希望编辑很有帮助。其中一些对你来说可能是微不足道的,但希望它也能帮助一些未来的读者。如果它说服一个人开始回馈开源,它将成为我的一天:)