C++编译

关于导入和导出

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值