gpt4 book ai didi

c++ - cmake add_library 如何决定符号的可见性?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:05:43 29 4
gpt4 key购买 nike

我正在使用 CMake add_library 命令构建一个共享库,如下所示:

add_library(mylibname OPTION SHARED SOURCES ${source_files} HEADERS ${header_files})

当我用“nm”检查这个库时,我发现一些符号标记为全局可见(“T”),而其他符号仅对库内部可见(“t”)。我的问题是,为什么?当我没有做任何特别的事情来控制它时,是什么决定了符号的可见性?

我问是因为碰巧当我将这个库链接到项目的另一部分时,我得到了 undefined reference 错误,这是因为出于某种原因,我需要的符号显然只在库内部可见。所以我想以某种方式将“t”更改为“T”,但是,由于我首先不知道是什么原因导致它成为“t”,我想我想先知道:) .

有问题的符号恰好是模板函数的特化,所以默认可见性可能与模板有关?

最佳答案

符号可见性是通过 <LANG>_VISIBILITY_PRESET 在每个目标的基础上控制的和 VISIBILITY_INLINES_HIDDEN 目标属性。这些的默认值取自变量 CMAKE_<LANG>_VISIBILITY_PRESET CMAKE_VISIBILITY_INLINES_HIDDEN 分别。如果设置了这两个变量,则可以解释您期望导出的符号是如何以某种方式在内部生成的。

另请注意,虽然某些编译器(例如 GCC、clang)默认导出符号,但在带有 Visual Studio 的 Windows 上它们默认不导出。

关于c++ - cmake add_library 如何决定符号的可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50637449/

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