我尝试了几个选项来正确设置库中的可见性。喜欢:
target_compile_options(MY_LIB PRIVATE "-fvisibility=hidden")
set_target_properties(MY_LIB PROPERTIES C_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN 1)
set_target_properties(MY_LIB PROPERTIES CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN 1)
或
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
两者都不起作用。我有一个要公开的特定功能,设置在一个块内
#pragma GCC visibilty push(default)
void thisShouldBeTheOnlyThingVisible(void) {
...
}
#pragma GCC visibilty pop
但是,如果我运行不同的工具,例如 objdump 或 readelf ,则不仅会看到所有不应列出的内部函数,而且还会看到文件名称和非静态变量名称。我不介意在 debug 模式下使用,但在 release 中,它不应该存在。
这里要隐藏所有我想隐藏的特殊功能的正确方法是什么?
谢谢
W
答案 0 :(得分:0)
我认为您正在寻找:
add_library(MY_LIB ${MY_SOURCES})
set_property(TARGET MY_LIB PROPERTY C_VISIBILITY_PRESET hidden)
set_property(TARGET MY_LIB PROPERTY VISIBILITY_INLINES_HIDDEN ON)
至少从cmake 3.14.4开始。
通过查看CMake的测试来确定这一点:
https://github.com/Kitware/CMake/blob/master/Tests/Visibility/CMakeLists.txt