我在我的应用程序中使用第三方静态库(这意味着我无法重新编译它)。
该库是使用number_of_mappers * N
构建的,即为了与macOS版本兼容< 10.9:从此版本开始,默认为-stdlib=libstdc++
。
但这意味着我的所有应用程序代码都必须使用stdlib=libc++
构建,这使我无法使用某些C ++ 11功能。
所以我尝试将此静态库转换为共享库,但随后符号不可见。
实际上,使用nm我可以看到它们被标记为-stdlib=libstdc++
而不是t
,这在静态链接时似乎没问题,但在动态链接时却没有。
我想改变全球所需符号的可见性。
我不确定如何在macOS上实现它,因为T
在这里不可用(它作为一个名为objcopy
的选项,似乎按照this SO answer执行我想要的操作
答案 0 :(得分:2)
我设法使用ld。
解决了这个问题 ld -r lib.a -o new_lib.a -alias _old_function_name _new_function_name
以这种方式导出的符号标记为全局。 它不可能在一次调用中重复使用相同的名称,但是这样做两次,即_function(t) - >函数(T) - > _function(T)
然后我用以下内容构建了我的共享库:
g++ -fpic -shared -Wl,-force_load new_lib.a -stdlib=libstdc++ -o lib.dylib
困扰我的唯一一件事是我在创建新的全局符号时没有找到如何删除旧符号,但这似乎不会产生任何问题。