C++ 更改OS X上隐藏符号的可见性

C++ 更改OS X上隐藏符号的可见性,c++,c,macos,shared-libraries,visibility,C++,C,Macos,Shared Libraries,Visibility,我在应用程序中使用了第三方静态库(这意味着我无法重新编译它)。 此库是使用-stdlib=libstdc++构建的,也就是说,为了与macOS版本的兼容性function(t)->_function(t) 然后,我使用以下方法构建了我的共享库: g++-fpic-shared-Wl,-force_load new_lib.a-stdlib=libstdc++-o lib.dylib 唯一困扰我的是,在创建新的全局符号时,我没有发现如何删除旧符号,但这似乎没有产生任何问题。我仅使用ld解决了这个问

我在应用程序中使用了第三方静态库(这意味着我无法重新编译它)。 此库是使用
-stdlib=libstdc++
构建的,也就是说,为了与macOS版本的兼容性<10.9:自此版本以来,默认情况下,
stdlib=libc++
。 但这意味着我所有的应用程序代码都必须使用
-stdlib=libstdc++
构建,这就阻止了我使用一些C++11特性

所以我试着将这个静态库转换成一个共享库,但是符号不可见。 实际上,使用nm,我可以看到它们被标记为
t
,而不是
t
,这在静态链接时似乎是正常的,但在动态链接时则不是

我想改变我需要的符号的可见性,使其全球化。
我不确定如何在macOS上实现它,因为这里没有
objcopy
(它是一个名为
--globalize symbol
的选项,根据我的说法,它似乎可以实现我想要的功能)

我只使用了ld就解决了这个问题

ld-r lib.a-o new\u lib.a-alias\u old\u function\u name\u new\u function\u name

以这种方式导出的符号标记为全局符号。 在一次调用中不可能重复使用相同的名称,但在两次调用时,即_function(t)->function(t)->_function(t)

然后,我使用以下方法构建了我的共享库:
g++-fpic-shared-Wl,-force_load new_lib.a-stdlib=libstdc++-o lib.dylib


唯一困扰我的是,在创建新的全局符号时,我没有发现如何删除旧符号,但这似乎没有产生任何问题。

我仅使用ld解决了这个问题

ld-r lib.a-o new\u lib.a-alias\u old\u function\u name\u new\u function\u name

以这种方式导出的符号标记为全局符号。 在一次调用中不可能重复使用相同的名称,但在两次调用时,即_function(t)->function(t)->_function(t)

然后,我使用以下方法构建了我的共享库:
g++-fpic-shared-Wl,-force_load new_lib.a-stdlib=libstdc++-o lib.dylib


唯一困扰我的是,在创建新的全局符号时,我没有发现如何删除旧符号,但这似乎没有产生任何问题。

objcopy
是[AFAICT]可用于macOS的
binutils
的一部分。从源代码或:在“binutils mac OS”上的web搜索将生成其他链接
objcopy
是[AFAICT]可用于macOS的
binutils
的一部分。无论是源代码还是:在“binutils mac OS”上的web搜索将生成其他链接