windows和linux环境 控制.dll和.so和.a导出函数表

68 篇文章 3 订阅
34 篇文章 0 订阅

1.windows控制DLL导出函数表

有2种方式:

第一种:

函数前添加导出说明:

#ifndef _DLL_H_
#define _DLL_H_//防重复定义

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */


DLLIMPORT void HelloWorld (void);


#endif /* _DLL_H_ */

第二种:

编写DEF文件,如下

LIBRARY RedisDll

EXPORTS
myRedisPut @1
myRedisGet @2
myRedisClear @3

hashSetBytes @4
hashGetBytes @5
hashQueryLen @6
hashIncBy @7

在项目属性中,链接->输入->模块定义文件  中指定

 编译后可以使用  Dependencies工具查看。

linux GCC控制so导出函数表

也有2种方式:

第一种:

默认是所有函数都是公开的,但是可以设置函数属性,全局默认都隐藏,仅公开部分:

先定义导出宏,

#if __GNUC__ >= 4
    #define  DLL_VISIBLE   __attribute__ ((visibility ("default")))
	#define  DLL_HIDE      __attribute__ ((visibility ("hidden")))
#else
    #define DLL_VISIBLE
    #define DLL_HIDE
#endif

编译时候,指定选项 -fvisibility=hidden

g++ -v -I. -fPIC -shared -fvisibility=hidden -o libtest.so test.cc

第二种:

类似windows使用导出函数表控制:

对于SO文件:

定义一个export.map文件,作为so文件的动态符号表说明:

{
global:
  func_1;
  func_2;
local: *;
};

编译时候:

gcc -shared -o libxxx.so wl, --version-script=export.map

或者在cmake中添加属性:

SET_TARGET_PROPERTIES (cxx_agent_d PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${PROJECT_SOURCE_DIR}/src/export.map\"")

如果是.a的静态库文件,则

定义一个export.sym文件,如下:

func_1
func_3

编译时

gcc -shared -o libxxx.so wl,--retain-symbols-file=export.sym

cmake可以设置属性:

SET_TARGET_PROPERTIES (cxx_agent_s PROPERTIES LINK_FLAGS "-Wl,--retain-symbols-file,\"${PROJECT_SOURCE_DIR}/src/export.sym\"")

编译后,可以使用

readelf -s libxx.so查看

多余的函数都在LOCAL部分。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值