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<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;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,368评论 0 3
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,161评论 1 32
  • 我的这个故事说出来,怕你认为是编的。 事实上,那是1996年的一个夏天,我乘火车去往北京。 在火车上,我肚子疼的要...
    健康育儿心理阅读 430评论 1 8
  • 一.$ 符号1 将“$”定义为变量,运行如下代码: 运行结果: 2 将代码修改如下: 运行结果: 由上操作对比可知...
    常威爆打来福阅读 402评论 0 2
  • 今天在看基于SVD(奇异值分解)的推荐系统,讲到了矩阵分解,突然间就对数学的意义有了全新的感悟,令人惊喜又兴奋。 ...
    刘开心_8a6c阅读 817评论 6 10