#ifdef PHP_WIN32
# include "tsrm_win32.h"
# include "win95nt.h"
# ifdef PHP_EXPORTS
# define PHPAPI __declspec(dllexport)
# else
# define PHPAPI __declspec(dllimport)
# endif
# define PHP_DIR_SEPARATOR '\\'
# define PHP_EOL "\r\n"
#else
# if defined(__GNUC__) && __GNUC__ >= 4
# define PHPAPI __attribute__ ((visibility("default")))
# else
# define PHPAPI
# endif
对比以上代码分析:
window 中,动态库dll中的符号需要导出时,必须在函数定义开头处加上 PHPAPI 即__declsspec(dllexport), 然后其他地方如果需要使用此dll中导出的符号,需要extern __declsspec(dllimport) 声明导出符号, (通常使用方和服务方都是包含同一个头文件,头文件中 PHPAPI自动识别 分别为 __declspec(dllexport) __declspec(dllimport)
linux中 默认符号是导出的,如果编译链接从那时 -fvisilibility 则会将所有的默认导出符号隐藏( 对于__attribute__((visibility("default"))))定义的函数 始终是导出符号
其他地方引用导出符号 直接extern PHPAPI 即可