我在应用程序中使用了第三方静态库(这意味着我无法重新编译它)。
此库是使用-stdlib=libstdc++
构建的,即与stdlib=libc++。
但这意味着我所有的应用程序代码都必须使用-stdlib=libstdc++
构建,这使我无法使用某些C ++ 11功能。
因此,我尝试将此静态库转换为共享库,但是符号不可见。
确实,使用nm可以看到它们被标记为t
而不是T
,这在静态链接时似乎可以,但在动态链接时则不能。
我想更改全局所需符号的可见性。
我不确定如何在macOS上实现它,因为objcopy
在这里不可用(根据this SO answer的说明,它作为名为--globalize-symbol
的选项似乎可以满足我的要求)
最佳答案
我设法仅使用ld来解决此问题。ld -r lib.a -o new_lib.a -alias _old_function_name _new_function_name
以这种方式导出的符号被标记为全局。
不可能在一个调用中重用相同的名称,但这是在两次执行此操作时,即_function(t)-> function(T)-> _function(T)
然后,我使用以下方法构建了共享库:g++ -fpic -shared -Wl,-force_load new_lib.a -stdlib=libstdc++ -o lib.dylib
唯一令我困扰的是,在创建新的全局符号时,我没有找到如何删除旧符号的方法,但这似乎没有产生任何问题。
关于c++ - 更改OS X上隐藏符号的可见性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49387330/