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部分。