¿Cuál es el equivalente de CMake a "gcc-fvisibility=hidden" cuando se controla el símbolo exportado de una biblioteca compartida?
(2)
En lugar de establecer indicadores de compilación directamente, debe utilizar una versión actual de CMake y las propiedades <LANG>_VISIBILITY_PRESET en su lugar. De esta manera, puede evitar las características específicas del compilador en sus listas CMake y mejorar la aplicabilidad entre plataformas (evitando errores como el soporte de GCC y no Clang).
Es decir, si está utilizando C ++, puede llamar a set(CMAKE_CXX_VISIBILITY_PRESET hidden)
para establecer la propiedad globalmente, o set_target_properties(MyTarget PROPERTIES CXX_VISIBILITY_PRESET hidden)
para limitar la configuración a una biblioteca específica o destino ejecutable. Si está utilizando C, simplemente reemplace CXX por C en los comandos antes mencionados. También es posible que desee investigar la propiedad VISIBLITY_INLINES_HIDDEN también.
La documentación para GENERATE_EXPORT_HEADER incluye algunos consejos más y ejemplos relacionados con ambas propiedades.
Desarrollé software multiplataforma en c ++. Como sé, Linux también exportó todos los símbolos por defecto, bien a través de "gcc -fvisibility=hidden"
Puedo configurar todos los símbolos exportados como ocultos, luego establecer __attribute__(visibility("default"))
para la clase y función I Quiero exportar, así que puedo controlar lo que quiero exportar.
Mi pregunta es, usando CMake, ¿cómo puedo hacer el trabajo como control "gcc -fvisibility = hidden"?
Puedes agregar una bandera al compilador de Cmake así:
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
Para asegurarse de que esto solo se haga bajo Linux, puede usar este código:
IF(UNIX)
IF(CMAKE_COMPILER_IS_GNUCC)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
ENDIF(CMAKE_COMPILER_IS_GNUCC)
ENDIF(UNIX)