阅读nodejs源代码时发现这一段导出win库符号宏:
#ifdef _WIN32
# ifndef BUILDING_NODE_EXTENSION
# define NODE_EXTERN __declspec(dllexport)
# else
# define NODE_EXTERN __declspec(dllimport)
# endif
#else
# define NODE_EXTERN /* nothing */
#endif
dllexport是vc库的概念,意为对外暴露接口
dllimport表明是从外部库中引入的接口(不存在这个声明也可以做到引入外部接口,但声明后对库的链接过程有帮助)
这里实质上是利用头文件的解析和宏定义做了一个使用者/提供者的区分
BUILDING_NODE_EXTENSION没有被定义的情况下,对库本身来说,生效的是dllexport
对使用者来说 只要在引入头文件之前 定义一下BUILDING_NODE_EXTENSION 就能让dllimport生效
#define BUILDING_NODE_EXTENSION
#include "node.h"
以下给出一个类似的应用例子:
假设有一个库lib.h lib.c
#ifndef _LIB_H
#define _LIB_H
#ifndef IS_USER
#define GOLDEN_VAL 0
#else
#define GOLDEN_VAL 1
#endif
int get_golden_val();
#endif
#include "lib.h"
int get_golden_val()
{
return GOLDEN_VAL;
}
#include<stdio.h>
#define IS_USER
#include "lib.h"
int main(int argc, char **argv) {
printf("user:golden val %d\n", GOLDEN_VAL); //输出1
printf("offer:golden val %d\n", get_golden_val()); //输出0
return 0;
}