CMake 编译报一堆“注意:包含文件”的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMake 编译报一堆“注意:包含文件”的问题相关的知识,希望对你有一定的参考价值。

参考技术A 原始链接:https://my.oschina.net/krysl/blog/5140847

以VS2010为例,找到对应的“clui.dll”,如:“C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\2052\clui.dll”

使用ResourceHacker(“http://www.angusj.com/resourcehacker/”),以管理员方式运行,打开“clui.dll”

将“注意:包含文件”替换为:“Note: including file:”

Action=>Compile Script,然后保存修改的dll,备份原来版本后,替换即可

CMake编译遇到这种ABI不兼容问题不要慌

最近,在Linux下使用CMake编译程序的时候遇到一个问题,特此做一个记录。

事情是这样的,我编译的程序使用了2个第三方库,在写好CMakeLists后,启动编译,然后就报链接错误,一直报一堆找不到定义。

类似这样的一堆:

‘***** std::__cxx11 *******’未定义的引用

我仔细检查代码和CMakeLists,各种修改尝试无果。最后,在同事和搜索引擎的帮助下终于找到问题所在了。

问题出在我使用的GCC和第三方库编译的时候使用的GCC版本差异太大,两者的ABI不兼容。

参考GCC提供的手册<Dual ABI>,事情就清晰了。

在GCC5.1发布的libstdc++中,添加了新的特性,其中包括了std::string和std::list的新实现。新的实现使得两者都符合了C++11的标准。但是,为了与现存代码兼容,libstdc++保留了老的实现,与新实现并存。具体怎么实现的呢?相比于老的实现,GCC5.1添加了__cxx11命名空间,在新的实现中的string和list,实际上是std::__cxx11::string和std::__cxx11::list。新旧ABI不兼容。

那么,问题怎么解决呢?

也很简单,就是统一你的程序和第三方库使用的实现版本。如果你有第三方库源码,那统一重新编译下就行。如果第三方库是已经编译好的那也没关系,GCC为我们提供了一个选择新旧实现的宏定义-D_GLIBCXX_USE_CXX11_ABI。

-D_GLIBCXX_USE_CXX11_ABI=0 表示使用旧的实现
-D_GLIBCXX_USE_CXX11_ABI=1 表示使用新的实现

按需添加到CMakeLists中就可以了。

以上是关于CMake 编译报一堆“注意:包含文件”的问题的主要内容,如果未能解决你的问题,请参考以下文章

vs2017调用libtorch 报一堆错误

在mingw环境下编译assimp

在mingw环境下编译assimp

如何在 CMake 中指定编译器?

如何在 CMake 中指定编译器?

VS Code 进行远程Cmake编译