C++ 为什么不';标记为“t”的函数;“隐藏的”;从GCC4中的外部模块调用时引发错误?

C++ 为什么不';标记为“t”的函数;“隐藏的”;从GCC4中的外部模块调用时引发错误?,c++,c,gcc,C++,C,Gcc,我正在使用gcc。4.4.7. 如果我将函数标记为隐藏在模块a.h中: //module A.h __attribute__ ((visibility ("hidden"))) void foo() { ... } 显然,我仍然可以从模块A.h中调用foo。如果我有第二个模块B.h引用A::foo: //module B.h #include "A.h" foo(); 为什么没有抛出错误?如果A::foo在模块B中技术上未定义 编辑删除了“在模块B中调用foo时不会发生任何事情”。有些代码

我正在使用gcc。4.4.7. 如果我将函数标记为隐藏在模块a.h中:

//module A.h
__attribute__ ((visibility ("hidden"))) void foo() { ... }
显然,我仍然可以从模块A.h中调用foo。如果我有第二个模块B.h引用A::foo:

//module B.h
#include "A.h"
foo();
为什么没有抛出错误?如果A::foo在模块B中技术上未定义

编辑删除了“在模块B中调用foo时不会发生任何事情”。有些代码设置错误了吗

edit2我正在研究如何在头文件中设置本地引用,以便不能从其他模块调用它们。也许我错过了什么


edit3我正在使用-fvisibility=hidden编译代码

您是否使用-fvisibility=hidden标志编译此代码?如果是,那就试试看

#pragma GCC visibility push(hidden)

您是否使用-fvisibility=hidden标志编译此代码?如果是,那就试试看

#pragma GCC visibility push(hidden)

您是否使用-fvisibility=hidden标志编译此代码?如果是,那就试试看

#pragma GCC visibility push(hidden)

您是否使用-fvisibility=hidden标志编译此代码?如果是,那就试试看

#pragma GCC visibility push(hidden)

可见性(“可见性类型”) 此属性影响其附加到的声明的链接。有四个受支持的可见性类型值:默认、隐藏、受保护或内部可见性

[……]

隐藏的 隐藏可见性表示声明的实体具有一种新的链接形式,我们称之为“隐藏链接”。具有隐藏链接的对象的两个声明如果位于同一共享对象中,则引用同一对象

链接在一起的两个编译单元位于同一个共享对象中

可见性(“可见性类型”) 此属性影响其附加到的声明的链接。有四个受支持的可见性类型值:默认、隐藏、受保护或内部可见性

[……]

隐藏的 隐藏可见性表示声明的实体具有一种新的链接形式,我们称之为“隐藏链接”。具有隐藏链接的对象的两个声明如果位于同一共享对象中,则引用同一对象

链接在一起的两个编译单元位于同一个共享对象中

可见性(“可见性类型”) 此属性影响其附加到的声明的链接。有四个受支持的可见性类型值:默认、隐藏、受保护或内部可见性

[……]

隐藏的 隐藏可见性表示声明的实体具有一种新的链接形式,我们称之为“隐藏链接”。具有隐藏链接的对象的两个声明如果位于同一共享对象中,则引用同一对象

链接在一起的两个编译单元位于同一个共享对象中

可见性(“可见性类型”) 此属性影响其附加到的声明的链接。有四个受支持的可见性类型值:默认、隐藏、受保护或内部可见性

[……]

隐藏的 隐藏可见性表示声明的实体具有一种新的链接形式,我们称之为“隐藏链接”。具有隐藏链接的对象的两个声明如果位于同一共享对象中,则引用同一对象


链接在一起的两个编译单元位于同一个共享对象中。首先,请不要将实际的函数定义放在头文件中!它使事情变得非常混乱。你是说编译单元和模块吗?也许我把一些术语弄糊涂了,我不知道我弄糊涂了。。区别是什么?您提到的资源只提到动态共享对象(即
.so
文件),这是一个比单个C文件粗糙得多的单元。啊,我明白了。那么我一定是误解了预处理器的情况。谢谢你首先,请不要把实际的函数定义放在头文件中!它使事情变得非常混乱。你是说编译单元和模块吗?也许我把一些术语弄糊涂了,我不知道我弄糊涂了。。区别是什么?您提到的资源只提到动态共享对象(即
.so
文件),这是一个比单个C文件粗糙得多的单元。啊,我明白了。那么我一定是误解了预处理器的情况。谢谢你首先,请不要把实际的函数定义放在头文件中!它使事情变得非常混乱。你是说编译单元和模块吗?也许我把一些术语弄糊涂了,我不知道我弄糊涂了。。区别是什么?您提到的资源只提到动态共享对象(即
.so
文件),这是一个比单个C文件粗糙得多的单元。啊,我明白了。那么我一定是误解了预处理器的情况。谢谢你首先,请不要把实际的函数定义放在头文件中!它使事情变得非常混乱。你是说编译单元和模块吗?也许我把一些术语弄糊涂了,我不知道我弄糊涂了。。区别是什么?您提到的资源只提到动态共享对象(即
.so
文件),这是一个比单个C文件粗糙得多的单元。啊,我明白了。那么我一定是误解了预处理器的情况。非常感谢。