编译Intel TBB库时出现问题

时间:2018-04-05 11:57:50

标签: emscripten

编译项目时,我得到大约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.




1 个答案:

答案 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

这可以帮助您完成下一个编译错误。祝你好运!

编辑1:

如何修复以下错误?

你需要意识到的是,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位架构。

您如何更轻松地获得帮助,帮助世界其他地方,获得良好的业力,并展示您不断增长的C ++ / Emscripten专业知识?

Fork Github上的存储库。创建一个Emscripten分支并使其工作(或至少尽可能远)。使用Emscripten更新自述文件以及构建的确切说明。

当你被困住时,请在此处提出另一个问题。但这一次,链接到您的github存储库。如果在我的机器上重现错误需要2分钟,我更有可能尝试并为您修复一些错误。

即使您没有成功完全移植它,您的努力也将公开发布,而其他人可能会在其上建立。

如果你设法完成它,那就做得好!你现在是一个开源贡献者 下一步是打开拉取请求以将其合并回主TTB存储库。然后,您的补丁将由英特尔的一些经验丰富的工程师进行审核,他们会指出您的代码/方法中的潜在问题,并且您将通过这样做了解很多。

顺便说一下,将这个贡献给主图书馆也对你的雇主有利。一旦它合并到主存储库中,它们将随着库的发展而维护该端口。其他人更有可能使用它并改进它。

最后,在几年内你可能想要换工作并进行一些面试。当询问你的经验和能力时,以下几点可以帮助你脱颖而出:

  3年前,我将英特尔TTB的库移植到了Emscripten。这比我原先预想的要难,但我最终使它成功了。然后由英特尔的2位高级工程师审核该补丁,并在代码审查后将其整合到库中。反馈令人羞愧,但它帮助我内化了我今天仍在使用的最佳实践,并有助于提高我的工作质量。

我希望编辑很有帮助。其中一些对你来说可能是微不足道的,但希望它也能帮助一些未来的读者。如果它说服一个人开始回馈开源,它将成为我的一天:)