# æ ‡å‡†C++库 OpenHarmony使用llvmå¼€æºé¡¹ç›®çš„C++æ ‡å‡†åº“[libc++](https://libcxx.llvm.org/)作为C++è¿è¡Œæ—¶åº“。 ## libc++版本 从OpenHarmony 4.0开始,libc++å‡çº§åˆ°clang/llvm 15.0.4版本 从OpenHarmony 3.2开始,libc++å‡çº§åˆ°clang/llvm 12.0.1版本 从OpenHarmony 3.0开始,libc++使用clang/llvm 10.0.1版本 ## C++è¯è¨€æ”¯æŒèƒ½åŠ› C++11ã€C++14æ ‡å‡†å·²å®Œå…¨æ”¯æŒï¼ŒC++17å’ŒC++20æ ‡å‡†æ£åœ¨å®Œå–„。具体è¯è¨€ç‰¹æ€§æ”¯æŒæ ‡å‡†å¯ä»¥å‚考[https://libcxx.llvm.org/](https://libcxx.llvm.org/)网站对应的Release Notes。 ## 如何在CMakeä¸é€‰æ‹©C++ 在NDKçš„{ndk_root}/build/cmake/ohos.toolchain.cmake文件ä¸ï¼Œå®šä¹‰äº†OHOS_STLå˜é‡ï¼Œå¯ä»¥é€šè¿‡è®¾ç½®"c++_shared"或者"c++_static"æ¥æŽ§åˆ¶åº”用工程ä¸åŽŸç”Ÿåº“链接C++è¿è¡Œåº“çš„æ–¹å¼ã€‚ * c++_shared,原生库动æ€é“¾æŽ¥libc++_shared.so * c++_static,原生库é™æ€é“¾æŽ¥libc++_static.a ## C++è¿è¡Œæ—¶å…¼å®¹æ€§ 在OpenHarmony系统ä¸ï¼Œç³»ç»Ÿåº“与应用原生库都在使用C++æ ‡å‡†åº“ï¼Œä¸¤éƒ¨åˆ†å‡çº§èŠ‚å¥ä¸ä¸€æ ·ï¼Œä¾èµ–C++è¿è¡Œæ—¶ç‰ˆæœ¬ä¹Ÿå¯èƒ½ä¸ä¸€æ ·ã€‚系统库ä¾èµ–çš„C++æ ‡å‡†åº“éšé•œåƒç‰ˆæœ¬å‡çº§ï¼Œè€Œåº”用原生库ä¾èµ–çš„C++æ ‡å‡†åº“éšç¼–译使用的SDK版本å‡çº§ï¼Œä¸¤éƒ¨åˆ†ä¾èµ–çš„C++基础库会跨多个大版本,产生ABI兼容性问题。为了解决æ¤é—®é¢˜ï¼ŒOpenHarmony上把两部分ä¾èµ–çš„C++æ ‡å‡†åº“è¿›è¡Œäº†åŒºåˆ†ã€‚ * 系统库:使用libc++.so, éšç³»ç»Ÿé•œåƒå‘布。 * 应用Native库:使用libc++_shared.so,éšåº”用å‘布。 两个库使用的C++命å空间ä¸ä¸€æ ·ï¼Œlibc++_shared.so使用__n1作为C++符å·çš„命å空间,libc++.so使用__h作为C++符å·çš„命å空间。 注æ„:两边使用的C++æ ‡å‡†åº“ä¸èƒ½è¿›è¡Œæ··ç”¨ï¼ŒNative API接å£å½“å‰åªèƒ½æ˜¯C接å£ï¼Œå¯ä»¥é€šè¿‡è¿™ä¸ªæŽ¥å£éš”离两边的C++è¿è¡ŒçŽ¯å¢ƒã€‚ ## 注æ„事项 1. C++è¿è¡Œæ—¶åº“工具链进行大版本å‡çº§çš„时候,ä¸ä¿è¯ä¸€å®šäºŒè¿›åˆ¶å…¼å®¹ï¼›ä¸€ä¸ªåº”用包如果有多个动æ€åº“,这些动æ€åº“**必须用åŒä¸€ä¸ªå¤§ç‰ˆæœ¬çš„clang工具链进行编译**,ä¾èµ–相åŒç‰ˆæœ¬çš„libc++_shared库,å¦åˆ™æœ‰å¯èƒ½äº§ç”Ÿä¸å¯é¢„知的错误。 2. 在一个应用工程里é¢ï¼Œå¦‚æžœåªæœ‰ä¸€ä¸ªå…±äº«åº“,建议使用é™æ€é“¾æŽ¥c++_staticï¼Œè¿™æ ·èƒ½å¤Ÿè®©é“¾æŽ¥å™¨ç²¾ç®€ä½¿ç”¨çš„C++è¿è¡Œæ—¶ä»£ç ,é™ä½ŽåŒ…大å°ã€‚如果有多个库,或者ä¾èµ–带动æ€åº“çš„har包,或者ohpm上带库的二进制ä¸é—´ä»¶ï¼Œå»ºè®®é‡‡ç”¨åŠ¨æ€é“¾æŽ¥C++库;采用é™æ€é“¾æŽ¥ä¼šå¯¼è‡´ç¨‹åºä¸å®šä¹‰å¤šä¸ªå‡½æ•°æˆ–å¯¹è±¡çš„å‰¯æœ¬ï¼Œä¼šç ´åC++çš„å•ä¸€å®šä¹‰è§„则(One Definition Rule),出现ä¸å¯é¢„知问题。