强制从带有GCC的链接静态库导出特定可见符号(同时排除其他符号)

强制从带有GCC的链接静态库导出特定可见符号(同时排除其他符号),c,gcc,static-libraries,visibility,C,Gcc,Static Libraries,Visibility,我试图提供对链接到静态库中可执行文件的函数的访问。原始的静态库定义了没有访问说明符的符号,我能够使用定义的方法访问该函数,使用MSVC可以很好地工作,因为默认情况下链接的符号是隐藏的 但是,在使用GCC时,我需要在使用-Wl,--exclude libs时导出函数,这可以防止从静态库中的链接导出所有其他不必要的符号。所讨论的符号不是从主应用程序本身引用的,但是第三方模块可能会尝试在外部动态使用该符号(ffi等),因此会使用未定义的强制符号 我需要导出的唯一符号是主应用程序中标记为visibili

我试图提供对链接到静态库中可执行文件的函数的访问。原始的静态库定义了没有访问说明符的符号,我能够使用定义的方法访问该函数,使用MSVC可以很好地工作,因为默认情况下链接的符号是隐藏的

但是,在使用GCC时,我需要在使用-Wl,--exclude libs时导出函数,这可以防止从静态库中的链接导出所有其他不必要的符号。所讨论的符号不是从主应用程序本身引用的,但是第三方模块可能会尝试在外部动态使用该符号(ffi等),因此会使用未定义的强制符号

我需要导出的唯一符号是主应用程序中标记为visibility default的符号,以及静态库中导入的某些函数(我可能无法修改)。我知道可以使用包装函数,但我想知道是否还有其他方法

那么,在使用-WL、-exclude libs、ALL时,是否可以从链接的静态库中导出符号(可见),而不使用任何其他(版本列表等)文件或命令/标志?(并且不修改静态库)

使用以下宏(部分)可以工作,但是原始函数符号仍然.hidden(将_MyFunction_fp导出为可见)

在本例中,MyFunction的实际定义/声明将存在于静态库中,并且不能更改


编辑:我发现上面的宏“力未定义”符号在MSVC下无法产生所需的符号可见性。似乎唯一有效的解决方案是使用pragma注释,即,u pragma(comment(linker,“/export:”#x))。也许gcc/ld也有类似的解决方案。

即使你成功了,你的建议听起来也很难维持。您需要静态库的共享对象(DLL)行为

当我遇到类似的问题(例如,第三方静态库)时,我将库包装在一个共享对象中,并将其用于我的应用程序

#define APIEXPORT __attribute__ ((visibility ("default")))
#define FORCE_UNDEFINED_SYMBOL(x) extern APIEXPORT void x(void); APIEXPORT void* __ ## x ## _fp =(void*)&x;
FORCE_UNDEFINED_SYMBOL(MyFunction)