G++ 和 Clang++ - 命名空间标准 _GLIBCXX_VISIBILITY(默认)
Posted
技术标签:
【中文标题】G++ 和 Clang++ - 命名空间标准 _GLIBCXX_VISIBILITY(默认)【英文标题】:G++ & Clang++ - namespace std _GLIBCXX_VISIBILITY(default) 【发布时间】:2013-11-05 19:26:50 【问题描述】:我正在尝试使用 clang++
编译我的 C++ 代码,但在命名空间冲突时不断收到此错误。我的 main.cpp 文件是一个简单的 Hello World 程序(用于调试)。
我感觉问题出在我在集群上编译的 GCC 或 clang 版本上。关于如何追踪这个问题的任何想法?或解决问题的步骤?
[aebrenne@hpc src]$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/data/apps/gcc/4.8.1/libexec/gcc/x86_64-unknown-linux-gnu/4.8.1/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ./configure --with-gmp=/data/apps/gmp/5.1.2 --with-mpfr=/data/apps/mpfr/3.1.2 --with-mpc=/data/apps/mpc-1.0.1 --enable-threads=posix --with-as=/data/apps/binutils/2.23.2/bin/as --mandir=/data/apps/gcc/4.8.1/man --pdfdir=/data/apps/gcc/4.8.1/pdf --htmldir=/data/apps/gcc/4.8.1/html --enable-languages=c,c++,fortran,ada,go,java,lto,objc,obj-c++ --prefix=/data/apps/gcc/4.8.1
Thread model: posix
gcc version 4.8.1 (GCC)
[aebrenne@hpc src]$ clang++ --version
clang version 3.4 (trunk 193367)
Target: x86_64-unknown-linux-gnu
Thread model: posix
[aebrenne@hpc src]$
[aebrenne@hpc src]$ cat main.cpp
#include <iostream>
int main()
std::cout << "Starting test..." << std::endl;
return 0;
[aebrenne@hpc src]$ clang++ -std=c++11 -Wall -g -I/data/apps/gcc/4.8.1/include/c++/4.8.1 main.cpp
In file included from main.cpp:1:
In file included from /data/apps/gcc/4.8.1/include/c++/4.8.1/iostream:39:
In file included from /data/apps/gcc/4.8.1/include/c++/4.8.1/ostream:38:
In file included from /data/apps/gcc/4.8.1/include/c++/4.8.1/ios:38:
In file included from /data/apps/gcc/4.8.1/include/c++/4.8.1/iosfwd:39:
In file included from /data/apps/gcc/4.8.1/include/c++/4.8.1/bits/stringfwd.h:40:
/data/apps/gcc/4.8.1/include/c++/4.8.1/bits/memoryfwd.h:50:15: error: expected ''
namespace std _GLIBCXX_VISIBILITY(default)
^
/data/apps/gcc/4.8.1/include/c++/4.8.1/bits/memoryfwd.h:50:15: error: C++ requires a type specifier for all declarations
namespace std _GLIBCXX_VISIBILITY(default)
^~~~~~~~~~~~~~~~~~~
/data/apps/gcc/4.8.1/include/c++/4.8.1/bits/memoryfwd.h:50:35: error: expected expression
namespace std _GLIBCXX_VISIBILITY(default)
^
/data/apps/gcc/4.8.1/include/c++/4.8.1/bits/memoryfwd.h:50:43: error: expected ';' after top level declarator
namespace std _GLIBCXX_VISIBILITY(default)
^
【问题讨论】:
在我看来_GLIBCXX_VISIBILITY()
是一个宏,可以在 g++ 下正确扩展为某些内容,但 clang++ 没有看到它的定义,因此预处理器将该字符串留在了那里,而 clang++ 将其视为一个标识符,这是意外的。
【参考方案1】:
因为这是按照以下方式搜索的第一个结果:
error: expected unqualified-id before 'namespace'
namespace std _GLIBCXX_VISIBILITY(default)
我承认我得到了这个错误,因为在回溯中提到的那个之前包含的头文件中缺少一个右大括号。
希望这对某人有所帮助。
【讨论】:
我的问题是什么,谢谢!我将函数声明从 .cpp 文件复制到 .h 文件,但不小心在末尾留下了一个括号,如下所示: int some_function() 删除括号并添加分号已修复问题。愚蠢的编译器从一开始就不能这么说…… 在我的例子中,我的头文件的最后一个函数缺少一个分号... C++ 是 C++。【参考方案2】:我遇到了同样的问题。
问题是我只有以下CPATH
:
<gcc-install-path>/include/c++/<gcc-version>
在同一目录中grep
ing for _GLIBCXX_VISIBILITY
之后,似乎宏是在子目录中定义的,特定于主机。就我而言,这是x86_64-unknown-linux-gnu
。将其添加到CPATH
解决了这个问题。我的新CPATH
是:
<gcc-install-path>/include/c++/<gcc-version>:<gcc-install-path>/include/c++/<gcc-version>/<machine-specific-headers>
对于我的示例机器,这转换为:
export CPATH=~/f/i/gcc-4.8.4/include/c++/4.8.4:~/f/i/gcc-4.8.4/include/c++/4.8.4/x86_64-unknown-linux-gnu
我希望对某人有所帮助。
【讨论】:
【参考方案3】:我正在使用 clang++ 4.2,它对我有用,奇怪
clang++ -std=c++11 -Wall -g main.cpp
如果你只是去掉 -I/data/apps/gcc/4.8.1/include/c++/4.8.1 会怎样
默认不行吗?
【讨论】:
不,这不起作用,也不需要,因为我将使用系统版本的 GCC 而不是我在我的环境中指定的版本 (4.8.1)。我正在使用module's 系统,但出于调试目的,我直接通过命令行包含它。【参考方案4】:为 GCC 定义函数的属性主题、命名空间传递的参数类型、调用协议等等。宏 _GLIBCXX_VISIBILITY(默认)是重新定义 属性(visibility_(默认))在 Windows 中未定义...在 Linux 中开启!至于另一个OC我不知道。您必须将此宏重新定义为空并在所有包含之前设置它们。所以发生错误。但这很奇怪...如果您设置面向STL平台,则必须进行适当的重新定义!您需要手动操作。至于我,我喜欢属性。它们允许控制任何编译器和被授权者不可用的某些方面的正确行为。例如,根据格式控制参数类型和在函数 printf 中传递的 vars 的数量。如果您传递了不同的类型或数量不足的 args 错误,则会作为编译错误发生!!!没有什么能提供这样的机会!!!在 Linux 上使用属性。这是个好主意……
【讨论】:
【参考方案5】:我遇到了同样的问题。
我混淆了 gcc 4.8 标头和系统标头(较低版本,gcc 4.4.6,_GLIBCXX_VISIBILITY 未定义)。
使用:
clang++ -std=c++11 -Wall -g -I/data/apps/gcc/4.8.1/include/c++/4.8.1 main.cpp -v -H
查看所有“包含”详细信息。
就我而言:
. /include/c++/4.8.2/iostream
.. /usr/lib64/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/c++config.h
... /include/bits/wordsize.h
... /usr/lib64/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/os_defines.h
.... /include/features.h
..... /include/stdc-predef.h
..... /include/sys/cdefs.h
...... /include/bits/wordsize.h
..... /include/gnu/stubs.h
...... /include/gnu/stubs-64.h
... /usr/lib64/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/cpu_defines.h
.. /include/c++/4.8.2/ostream
... /include/c++/4.8.2/ios
.... /include/c++/4.8.2/iosfwd
..... /include/c++/4.8.2/bits/stringfwd.h
...... /include/c++/4.8.2/bits/memoryfwd.h
In file included from test.cpp:1:
In file included from /include/c++/4.8.2/iostream:39:
In file included from /include/c++/4.8.2/ostream:38:
In file included from /include/c++/4.8.2/ios:38:
In file included from /include/c++/4.8.2/iosfwd:39:
In file included from /include/c++/4.8.2/bits/stringfwd.h:40:
/include/c++/4.8.2/bits/memoryfwd.h:50:15: error: expected ''
namespace std _GLIBCXX_VISIBILITY(default)
已修复:
clang++ -std=c++11 -isystem /include/c++/4.8.2/ -isystem /include/c++/4.8.2/x86_64-baidu-linux-gnu/ test.cpp -v -H
为此,_GLIBCXX_VISIBILITY 在 /include/c++/4.8.2/x86_64-baidu-linux-gnu/bits/c++_config.h 中定义
【讨论】:
同样的问题:***.com/questions/10308167/…以上是关于G++ 和 Clang++ - 命名空间标准 _GLIBCXX_VISIBILITY(默认)的主要内容,如果未能解决你的问题,请参考以下文章
g++ 和 clang++ 使用变量模板和 SFINAE 的不同行为