TVM 宏#
源码:tvm/include/tvm/runtime/c_runtime_api.h
// Macros to do weak linking
#ifdef _MSC_VER
#define TVM_WEAK __declspec(selectany)
#else
#define TVM_WEAK __attribute__((weak))
#endif
#ifdef __EMSCRIPTEN__
#include <emscripten/emscripten.h>
#define TVM_DLL EMSCRIPTEN_KEEPALIVE
#endif
// helper macro to suppress unused warning
#if defined(__GNUC__)
#define TVM_ATTRIBUTE_UNUSED __attribute__((unused))
#else
#define TVM_ATTRIBUTE_UNUSED
#endif
#ifndef TVM_DLL
#ifdef _WIN32
#ifdef TVM_EXPORTS
#define TVM_DLL __declspec(dllexport)
#else
#define TVM_DLL __declspec(dllimport)
#endif
#else
#define TVM_DLL __attribute__((visibility("default")))
#endif
#endif
这段代码主要是为了实现弱链接和动态库的导出。
首先,它定义了宏
TVM_WEAK
,用于实现弱链接。在 Windows 平台上,使用__declspec(selectany)
可以实现弱链接;在其他平台上,使用__attribute__((weak))
也可以实现弱链接。然后,它检查是否定义了
__EMSCRIPTEN__
。如果定义了,那么它会包含<emscripten/emscripten.h>
头文件,并定义宏TVM_DLL
,值为EMSCRIPTEN_KEEPALIVE
。这个宏用于告诉 Emscripten 在生成的 JavaScript 代码中保留这个函数或变量,以便在运行时可以访问到。接下来,它定义了宏
TVM_ATTRIBUTE_UNUSED
,用于抑制未使用的警告。在 GCC 编译器下,使用__attribute__((unused))
可以实现这个功能;在其他编译器下,这个宏没有定义。最后,它检查是否定义了
TVM_DLL
。如果没有定义,那么它会再次检查是否定义了_WIN32
。如果定义了_WIN32
,那么它会检查是否定义了TVM_EXPORTS
。如果定义了TVM_EXPORTS
,那么它会定义宏TVM_DLL
,值为__declspec(dllexport)
;否则,它会定义宏TVM_DLL
,值为__declspec(dllimport)
。如果_WIN32
没有定义,那么它会定义宏TVM_DLL
,值为__attribute__((visibility("default")))
。