win平台下C++符号导出技巧

阅读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

#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;
}

你可能感兴趣的:(win平台下C++符号导出技巧)