gpt4 book ai didi

c++ - __attribute__ ((weak)) 的处理在 clang 和 gcc 中是不同的

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:49 25 4
gpt4 key购买 nike

我有一个应用程序 (app) 和一个动态库/共享对象 (dlib),它们都链接到一个静态库,该静态库使用 __declspec (selectany) 在头文件中声明了一个全局变量 (gvar) |/__attribute__ ((weak)) .通过设计,app 和 dlib 都应该有自己的 gvar 拷贝(在 MSVC 和 GCC 上我完全明白这一点)。

移植到 Mac OSX 并用 clang 编译后,我看到 dlib 中的 gvar 链接到应用程序中的 gvar。不确定这是一个 clang 错误还是设计使然;如果是设计使然,是否有任何方法可以避免它并获得与 GCC/MSVC 中相同的行为?

clang 版本:

bash-3.2$ c++ --version
Apple LLVM version 7.0.0 (clang-700.1.76)
Target: x86_64-apple-darwin15.0.0
Thread model: posix

重现问题的最小项目:

主要.cpp:

#include <stdio.h>
#include <dlfcn.h>

__attribute__ ((weak)) int g_global = 10;

int main ()
{
printf ("main (): g_global: addr = %p; value = %d\n", &g_global, g_global);

typedef void Foo ();

void* so = dlopen ("./my-so.so", RTLD_LAZY | RTLD_LOCAL);
Foo* foo = (Foo*) dlsym (so, "foo");
foo ();
}

共享.cpp:

#include <stdio.h>

__attribute__ ((weak)) int g_global = 20;

extern "C" void foo ()
{
printf ("foo (): g_global: addr = %p; value = %d\n", &g_global, g_global);
}

构建.sh:

#!/bin/bash

rm -f my-so.so
rm -f app.

c++ -shared -fPIC shared.cpp -omy-so.so
c++ main.cpp -oapp -ldl

输出:

bash-3.2$ ./app
main (): g_global: addr = 0x10c657030; value = 10
foo (): g_global: addr = 0x10c657030; value = 10

请注意,如果我删除 attribute ((weak)),则 app 和 dlib 会获得它们自己的 gvar 拷贝。

最佳答案

我在这里找到了答案: https://gcc.gnu.org/wiki/Visibility

为了获得我想要的行为,我必须将 -fvisibility=hidden 添加到命令行并将 __attribute__ ((visibility ("default"))) 添加到需要导出的符号。

关于c++ - __attribute__ ((weak)) 的处理在 clang 和 gcc 中是不同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33751909/

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