【C++ + VSCode + Clang Format Google format 、\r\n回车符设置】

简介

vscode的clang-format插件就提供了clang和C/C++代码的Style的检查和格式化功能,而且还能指定VisualStudio、LLVM、Google等多种code style格式,点击vscode主窗口左侧的的Extensions,输入clang-format搜索到这个插件,并进行安装

依赖

安装clang-format插件需要用到的clang-format可执行文件,例如在Ubuntu下,执行:

     sudo  apt-get install clang-format

Windows版在https://llvm.org/builds/下载LLVM来安装:

安装完毕后,检查能否工作

设置clang-format的code style,在vscode里进入菜单File->Preference->Settings,点左侧的Extensions->Clang-Format Configure

在出现的窗口里 将clang-format:Fallback Style和最后面的clang-format:style以及C:Style和Cpp:Style设置为Google

     

然后就可以在源码中在鼠标右键弹出菜单中选择Format Document格式化整个文件成Google Style了或者使用shift+alt+F

如果只格式所选择的部分代码,先选择代码,然后再鼠标右键菜单中选择Format selection 即可:

      当然上面这些format只是解决代码排版上的缩进和过长的行折回换行以不超过指定的列数(例如80)之类的容易format的问题,对于Google Style要求的一些细小琐碎的细节要求,你还得自己手工去改,例如//后面需空一格,前面有代码的话需要空两格,函数的参数后的逗号后面必须空格,函数的{必须写在函数的参数结束的右括号空一格的后面,等等,这些有点吹毛求疵的细节规定,只能自己手工去修改以符合要求。

设置回车符

并且在windows和linux开发中,我们常常会遇到\r\n比较恶心的问题,也是可以在vscode中进行设置。搜索eol然后都统一为linux的\n就可以

CXXABI

ABI协议接口保证程序与操作系统的无关

但如果在CMakeLists里设置

add_definitions(-D _GLIBCXX_USE_CXX11_ABI=0)就无法正常链接

编译器只会链接libinference_engine_legacy.so,而没有libinference_engine.so

当设置add_definitions(-D _GLIBCXX_USE_CXX11_ABI=1)

就不会出现这样的情况。并且后续会报出符号未定义的错,如下所示。

my_lib.so: undefined reference to `InferenceEngine::Core::LoadNetwork(InferenceEngine::CNNNetwork, std::string const&, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > const&)'
my_lib.so: undefined reference to `InferenceEngine::Data::getName() const'
my_lib.so: undefined reference to `InferenceEngine::Core::Core(std::string const&)'
my_lib.so: undefined reference to `InferenceEngine::details::InferenceEngineException::InferenceEngineException(std::string const&, int, std::string const&)'
my_lib.so: undefined reference to `InferenceEngine::Core::ReadNetwork(std::string const&, std::string const&) const'

在GCC5.1发布的同时,为libstdc++添加了新的特性,其中也包括了std::stringstd::list的新实现。这个新的实现使得两者符合了c++11的标准,具体来说是取消了Copy-On-Write

那么,这样子虽然符合了c++11的标注,旧版就无法兼容了。为了避免上述混乱,对于旧版而言,GCC5.1添加了__cxx11命名空间,GCC5.1或者说c++11规范下的string和list,实际上是std::__cxx11::stringstd::__cxx11::list

所以我们一般的using namespace std就会变成形如using namespace std::__cxx11的样子

也就是说,有旧版(c++03规范)的libstdc++.so,和新版(c++11规范)的libstdc++.so两个库同时存在。

为了避免两个库到底选择哪一个的麻烦,GCC5.1就引入了-D_GLIBCXX_USE_CXX11_ABI来控制编译器到底链接哪一个libstdc++.so

  • -D_GLIBCXX_USE_CXX11_ABI=0 链接旧版库
  • -D_GLIBCXX_USE_CXX11_ABI=1 链接新版库

提示符号未定义,因为第三方库libinference_engine.so,它是使用c++11规范的libstdc++.so,所以我在引用的时候,也必须使用相同规范的libstdc++.so,否则在这个第三方的内部,std::string就必须改成std::__cxx11::string才能使用_GLIBCXX_USE_CXX11_ABI=0

猜你喜欢

转载自blog.csdn.net/weixin_43953700/article/details/123783421