Zeks
Zeks

Reputation: 2385

What exactly set(CMAKE_CXX_VISIBILITY_PRESET hidden) does with cmake?

I mean, I know that it's supposed to default everything that isn't explicitly exported as "default" as hidden, but when I try to use it (on a debug build) and compare builds of the shared library with it and without it, the output of readelf -Ws --dyn-syms libLibrary.so is exactly the same, with everything having default visibility. What can I be missing?

This option comes with GenerateExternalHeader module from its example but I don't want to just mindlessly set flags because the (often incorrect) documentation tells me to. And in this case I cannot understand what this option even does if anything.

Upvotes: 1

Views: 3988

Answers (1)

KamilCuk
KamilCuk

Reputation: 141493

Adds -fvisibility=hidden to command line arguments of GCC and clang.

Adds here: https://gitlab.kitware.com/cmake/cmake/-/blob/master/Source/cmLocalGenerator.cxx#L2200 .

Option comes from CMAKE_${LANG}_COMPILE_OPTIONS_VISIBILITY property:

/usr/share/cmake $ ag _COMPILE_OPTIONS_VISIBILITY
Modules/Compiler/AppleClang-CXX.cmake
15:  set(CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN "-fvisibility-inlines-hidden")

Modules/Compiler/AppleClang-OBJCXX.cmake
13:set(CMAKE_OBJCXX_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN "-fvisibility-inlines-hidden")

Modules/Compiler/Clang-CXX.cmake
15:  set(CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN "-fvisibility-inlines-hidden")

Modules/Compiler/Clang-HIP.cmake
9:  set(CMAKE_HIP_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN "-fvisibility-inlines-hidden")

Modules/Compiler/Clang.cmake
36:    set(CMAKE_${lang}_COMPILE_OPTIONS_VISIBILITY "-fvisibility=")

Modules/Compiler/GNU-CXX.cmake
17:    set(CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN "-fno-keep-inline-dllexport")
21:    set(CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN "-fvisibility-inlines-hidden")

Modules/Compiler/GNU-OBJCXX.cmake
14:  set(CMAKE_OBJCXX_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN "-fvisibility-inlines-hidden")

Modules/Compiler/GNU.cmake
32:    set(CMAKE_${lang}_COMPILE_OPTIONS_VISIBILITY "-fvisibility=")

Modules/Compiler/IntelLLVM-CXX.cmake
23:  set(CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN "-fvisibility-inlines-hidden")

Modules/Compiler/IntelLLVM.cmake
54:    set(CMAKE_${lang}_COMPILE_OPTIONS_VISIBILITY "-fvisibility=")

Modules/Compiler/NVIDIA-CUDA.cmake
48:  set(CMAKE_CUDA_COMPILE_OPTIONS_VISIBILITY -Xcompiler=-fvisibility=)

Modules/Compiler/QCC-CXX.cmake
15:set(CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN "-fvisibility-inlines-hidden")

Modules/Platform/AIX-GNU-CXX.cmake
3:unset(CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN)

Modules/Platform/AIX-GNU.cmake
20:    unset(CMAKE_${lang}_COMPILE_OPTIONS_VISIBILITY)

Modules/Platform/Apple-Intel.cmake
17:    set(CMAKE_${lang}_COMPILE_OPTIONS_VISIBILITY "-fvisibility=")

Modules/Platform/Apple-IntelLLVM.cmake
16:  set(CMAKE_${lang}_COMPILE_OPTIONS_VISIBILITY "-fvisibility=")

Modules/Platform/HP-UX-GNU-CXX.cmake
3:unset(CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN)

Modules/Platform/HP-UX-GNU.cmake
19:  unset(CMAKE_${lang}_COMPILE_OPTIONS_VISIBILITY)

Modules/Platform/Linux-Fujitsu.cmake
14:  set(CMAKE_${lang}_COMPILE_OPTIONS_VISIBILITY "-fvisibility=")

Modules/Platform/Linux-Intel.cmake
57:    set(CMAKE_${lang}_COMPILE_OPTIONS_VISIBILITY "-fvisibility=")

Modules/Platform/Linux-IntelLLVM.cmake
54:  set(CMAKE_${lang}_COMPILE_OPTIONS_VISIBILITY "-fvisibility=")

Upvotes: 1

Related Questions