什么(如果有的话)是处理Mac上libc ++和stdlibc ++之间ABI不一致的好方法?
问题:许多c ++ 11特性需要C++标准库的新libc ++实现.但是libc ++与旧的libstdc ++不是ABI兼容的,而目前大多数软件通常都与后者相关联.例如,系统编译器仍然使用stdlibc ++,这意味着我用macports安装的所有库对于像字符串这样的std类都有不同的ABI,并且对于大量使用c ++ 11的项目是不可链接的.
我当前的解决方案:保留两个版本的库,这通常会导致问题(boost,opencv等)并链接到相应的.
我想有人可能会建议,如果我真的想要使用libc ++,我应该使用stdlibc ++清除我的系统,并确保macports(或其他任何地方)的任何内容只与libc ++链接.你可以看到这个任务看起来多么令人生畏.
有没有人找到一个很好的方式来解决我们生活在这个"stdlib-limbo"之间的问题?:)
编辑:我更明确地提出了一个隐含的后续问题:Apple将libc ++和libstdc ++与他们的系统一起发布.假设有人攻击了潜在的问题并尝试转换到libc ++ - 仅.从libstdc ++切换到libc ++的推荐方法是什么,因为系统上当前安装的100%库(一些随系统一起提供,大多数通过macport,一些通过手动编译)链接到libstdc ++(如果有的话) )?有没有人这样做并活了下来?
OSX上的不同libjpeg动态库之间存在动态链接冲突.首先是标准的原生libJPEG.dylib(在/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/中).但是,如果您使用的是MacPorts,则还可以在/ opt/local/lib中使用与端口相关的libjpeg.dylib.例如,后者可以作为某些其他端口的依赖项安装.
当您链接到系统libJPEG(这是首选)时,这会产生问题.然后,如果/opt/local/lib在DYLD_LIBRARY_PATH中,则在搜索动态库时将优先考虑该路径,从而在加载符号时导致运行时错误:
dyld: Symbol not found: __cg_jpeg_resync_to_restart
Referenced from:
/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
Expected in: /opt/local/lib/libJPEG.dylib
in /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
Trace/BPT trap: 5
Run Code Online (Sandbox Code Playgroud)
所以我有两个问题(可能相关):
什么是解决实际问题的好方法(/opt/local/lib从DYLD_LIBRARY_PATH显然解决它但从而为其他依赖创建问题)?
搜索动态库的其他路径(即指定的"/ System/Library"路径在哪里)以及为什么DYLD_LIBRARY_PATH的优先级更高?
我正在链接静态库,我想知道如何处理llvm/Clang中的死代码剥离.我找不到任何提示Clang有一些等效的-Wl, - gc-section或-dead_strip的文档.
我假设在更高的优化级别自动执行一些死代码消除,但gcc也是如此,对吧?然而,gcc通过上面提到的标志提供了一些明确的控制.Clang没有提供,或者我错过了什么?
(系统是OSX)