关于导入和导出
Mac下(Xcode工具Debug下能识别,Release找不到符号)
第一种方式:
__attribute__((visibility(“default”)))
__attribute__((visibility(“hidden”)))
第二种方式:
#pragma GCC visibility push(default)
#pragma GCC visibility pop
第三种方式:(未验证)
编译添加-fvisibility
Linux下
默认为导出,但大多数函数是不导出的,建议-fvisibility=hidden
Windows下
__declspec(dllexport)
__declspec(dllimport)
常规写法
#if defined(LIB_EXPORTS)
#if defined(_MSC_VER)
#define LIB_API __declspec(dllexport)
#else
#define LIB_API __attribute__((visibility("default")))
#endif
#else
#if defined(_MSC_VER)
#define LIB_API __declspec(dllimport)
#else
#define LIB_API
#endif
#endif
例子
class LIB_API DemoClass{};
namespace DemoNameSpace
{
LIB_API void print();
}
#pragma GCC visibility push(default)
void print();
#pragma GCC visibility pop
关于废弃
#if AV_GCC_VERSION_AT_LEAST(3,1)
# define attribute_deprecated __attribute__((deprecated))
#elif defined(_MSC_VER)
# define attribute_deprecated __declspec(deprecated)
#else
# define attribute_deprecated
#endif
关于加载库执行
#include <cstdio>
// Windows dllmain
#if defined(WIN32) || defined(WIN64)
#include <windows.h>
void Lib_Initialise();
void Lib_DeInitialise();
BOOL APIENTRY DllMain(HANDLE hMoudle, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
Lib_Initialise();
break;
case DLL_PROCESS_DETACH:
Lib_DeInitialise();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
#endif
// Macos and linux dllmain
#if defined(__APPLE__) || defined(__linux__)
void Lib_Initialise() __attribute__((constructor));
void Lib_DeInitialise() __attribute__((destructor));
#endif
void Lib_Initialise()
{
printf("Init lib %d\n",__LINE__);
}
void Lib_DeInitialise()
{
printf("Deinit lib %d\n",__LINE__);
}
LIBRARY libsamplerate-0.dll
EXPORTS
src_new @1
src_delete @2