cmake如何决定为符号设置可见性?

3
我正在使用CMake的add_library命令构建一个共享库,如下所示:
add_library(mylibname OPTION SHARED SOURCES ${source_files} HEADERS ${header_files})

当我使用“nm”检查这个库时,我发现一些符号被标记为全局可见(“T”),而其他符号仅在库内部可见(“t”)。我的问题是,为什么会这样?当我没有特别控制它时,什么确定了符号的可见性呢?
我问这个问题是因为我恰好将这个库链接到项目的另一部分时出现了未定义的引用错误,原因是我需要的符号显然只对库内部可见。因此,我想以某种方式将“t”更改为“T”。但是,由于我不知道什么导致它最初成为“t”,所以我认为首先应该了解一下。
所涉及的符号碰巧是模板函数的特化,因此默认可见性可能与模板有关?

1
可能你正在查看“静态”函数,它们可能只出现为内部可见。我猜私有成员也属于这个类别。换句话说,我不认为add_library本身会对可见性做出任何决定。 - Malachi
嗯,好的,也许我的问题更加普遍 :). 还有什么原因会导致编译器将符号设置为仅内部可用?我的函数既不是静态的也不是类成员,它只是一个显式实例化的模板函数实例。 - Ben Farmer
2
不是很确定。你能否包含一些代码片段来给我们一个想法? - Malachi
1
例子?什么样的例子?这是一个普遍的问题。我可以稍后提供引发问题的特定代码片段,但我的问题并不特别针对它。 - Ben Farmer
显示剩余2条评论
1个回答

1
符号可见性是在每个目标上通过 <LANG>_VISIBILITY_PRESETVISIBILITY_INLINES_HIDDEN 目标属性进行控制。这些的默认值取自变量 CMAKE_<LANG>_VISIBILITY_PRESETCMAKE_VISIBILITY_INLINES_HIDDEN。如果这两个变量已设置,那么可能会解释为什么您期望导出的符号被设置为内部。
还要注意的是,尽管某些编译器(例如 GCC、clang)默认情况下导出符号,但在 Windows 上使用 Visual Studio 时,默认情况下不导出符号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接