Windows平台下MSVC共享段C代码迁移至Clang的等效实现咨询
Windows平台下Clang共享段变量的等效实现
Clang在Windows平台下不支持GCC的shared属性,但可以通过链接器指令+段属性的组合,实现和MSVC、GCC一致的共享段变量效果。
直接实现代码
// 显式告知链接器设置.shr段的权限为可读、可写、可共享 #pragma comment(linker, "/SECTION:.shr,RWS") // 将变量指定到.shr段 volatile int g_global __attribute__((section(".shr"))) = 0;
关键说明
- 链接器指令
#pragma comment(linker, "/SECTION:.shr,RWS")是核心:Clang不会自动通过属性配置段权限,必须显式指定段的RWS权限,保证变量在进程间可共享。 __attribute__((section(".shr")))用于将变量放入目标段,段名需和链接器指令中的.shr完全对应(包含开头的.,和MSVC的写法保持一致)。volatile修饰符不能省略,避免编译器优化导致共享变量的访问异常。
跨编译器兼容写法
如果需要同时适配MSVC、GCC和Clang,可以用条件编译区分实现:
#ifdef _MSC_VER #pragma comment(linker, "/SECTION:.shr,RWS") #pragma data_seg(".shr") volatile int g_global = 0; #pragma data_seg() #elif defined(__GNUC__) && !defined(__clang__) volatile int g_global __attribute__((section("shr"), shared)) = 0; #elif defined(__clang__) #pragma comment(linker, "/SECTION:.shr,RWS") volatile int g_global __attribute__((section(".shr"))) = 0; #endif
内容的提问来源于stack exchange,提问作者bico
相关产品推荐
相关产品推荐

