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

时间:2018-06-01 06:38:01

标签: c++ cmake shared-libraries visibility undefined-symbol

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

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

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

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

有问题的符号恰好是模板功能的特化,所以默认的可见性可能与模板或其他东西有关吗?

1 个答案:

答案 0 :(得分:0)

使用<LANG>_VISIBILITY_PRESETVISIBILITY_INLINES_HIDDEN目标属性,在每个目标的基础上控制符号可见性。这些的默认值分别取自变量CMAKE_<LANG>_VISIBILITY_PRESETCMAKE_VISIBILITY_INLINES_HIDDEN。如果设置了这两个变量,这可以解释您希望导出的符号在某种程度上是内部的。

另请注意,虽然默认情况下会使用某些编译器(例如GCC,clang)导出符号,但在Windows上使用Visual Studio时,默认情况下不会导出符号。