gpt4 book ai didi

c++ - 警告 : 'visibility' attribute ignored - symbol visibility - C++/gcc

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:45 26 4
gpt4 key购买 nike

相关主题: Why does const imply internal linkage in c++, when it doesn't in C?

我正在关注 GCC visibility wiki为我的共享库添加可见性。

当我编译我的源文件时它会生成一个警告

warning: 'visibility' attribute ignored [-Wattributes]

这是我的代码:

// my_shared_lib.h
#if __GNUC__ >= 4
#define DLL_API __attribute__((visibility("default")))
#define DLL_LOCAL __attribute__((visibility("hidden")))
#else
#define DLL_API
#define DLL_LOCAL
#endif
DLL_LOCAL const int my_local_var;

编译时产生如下警告:

my_shared_lib.h: 'visibility' attribute ignored [-Wattributes]
DLL_LOCAL const int my_local_var;
^

这是整个建筑信息:

make all
Building file: ../src/my_shared_lib.cc
Invoking: Cross G++ Compiler
g++-mp-4.8 -O3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/my_shared_lib.d" -MT"src/my_shared_lib.d" -o "src/my_shared_lib.o" "../src/my_shared_lib.cc"
my_shared_lib.h: 'visibility' attribute ignored [-Wattributes]
DLL_LOCAL const int my_local_var;
^
Finished building: ../src/my_shared_lib.cc

谁能告诉我如何消除这个警告以及为什么会出现这个警告?

是不是因为const变量默认是隐藏的?

附言。我正在使用 g++ 4.8

最佳答案

您可以通过将 -Wno-attributes 传递给编译来消除警告。

出现警告是因为,正如相关问题和答案所提到的,在 C++ 中,const 对象自动具有内部链接,除非它们被显式标记为 extern;即默认情况下它们是隐藏的。基本原理是鼓励将这些 const 值按原样放入头文件中(即以 const int x = value; 的形式)。如果默认情况下它们是公开的,那么如果同一个变量出现在多个 .cpp.o 文件中,您将遇到多重链接问题,如果它们会发生这种情况被放置在没有本地链接规则的.h文件中。

您还应该看到警告/错误:

my_shared_lib.h:...: error: uninitialized const 'my_local_var' [-fpermissive]

这是错误的变体,因为 const 是隐式静态的,除非另有说明。

你如何解决这个问题?

首先,在使用C++时,在header中正确使用const,它是:

const int my_local_var = VALUE;

如果您在 CC++ 代码之间共享此 .h 文件,那么您的选择是:

  1. 不要让它成为 const - 这对于 C 代码实际上没有意义,并且会阻止您完成私有(private)的,在 header 中声明并在 中定义>.c 文件但未在生成的 .so
  2. 中公开
  3. 使用 #define - 是的,它很丑,但这在语义上比对 C 代码使用 const 更正确,因为它可以防止您意外更改值错误的分配。
  4. 在 .h 中声明为:

...

DLL_LOCAL extern const int my_local_var;

然后在.cc/.cpp文件中定义为:

 #include "my_shared_lib.h"

const int my_local_var = 42;

您需要在 #include 中添加,否则它不会获得 extern 允许它在 .o< 中公开链接 组成 .so 的文件,而不会在 .so 本身中暴露它。

所以我们有(在 Mac 上,但前提是相同的):

标题:

$ cat wodge.h

#define PRIVATE __attribute__((visibility("hidden")))
#define PUBLIC __attribute__((visibility("default")))

PRIVATE extern const int my_local_var;
int do_with_x(int x);

第一个C++文件:

$ cat wodge.cc

#include "wodge.h"

int
do_with_x(int y)
{
return my_local_var * y;
}

第二个 C++ 文件 - 值的定义:

$ cat wodge2.cc 
#include "wodge.h"

const int my_local_var = 42;

编译并显示生成的符号表:

$ g++-4.8 -c -O3 -Wall -o wodge.o wodge.cc
$ g++-4.8 -c -O3 -Wall -o wodge2.o wodge2.cc
$ g++-4.8 -shared -o foo.dylib *.o
$ nm foo.dylib
0000000000000fb0 T __Z9do_with_xi
0000000000000fbc s _my_local_var
U dyld_stub_binder

关于c++ - 警告 : 'visibility' attribute ignored - symbol visibility - C++/gcc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26025708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com