2013-06-13 8 views
20

Opracowałem oprogramowanie dla platformy w języku C++. Jak wiem, Linux .so wyeksportował wszystkie symbole domyślnie, dobrze przez "gcc -fvisibility=hidden" Mogę ustawić wszystkie eksportowane symbole jako ukryte, a następnie ustawić __attribute__(visibility("default")) dla klasy i funkcji, którą chcę wyeksportować, dzięki czemu mogę kontrolować, co chcę wyeksportować.Co to jest CMake odpowiednik "gcc -fvisibility = hidden" podczas kontrolowania eksportowanego symbolu biblioteki współdzielonej?

Moje pytanie brzmi, używając CMake, jak mogę wykonać pracę jako kontrolę "gcc -fvisibility = hidden"?

Odpowiedz

39

Zamiast ustawiać flagi kompilatora bezpośrednio, powinieneś zamiast tego używać aktualnej wersji CMake i <LANG>_VISIBILITY_PRESET. W ten sposób możesz uniknąć specyfiki kompilatora w swoich CMakeListach i ulepszyć zastosowanie różnych platform (unikając błędów, takich jak wspieranie GCC, a nie Clang).

To znaczy, jeśli używasz C++ byś albo zadzwonić set(CMAKE_CXX_VISIBILITY_PRESET hidden) ustawić właściwość globalnie lub set_target_properties(MyTarget PROPERTIES CXX_VISIBILITY_PRESET hidden) ograniczyć ustawienie konkretnej bibliotece lub wykonywalnego cel. Jeśli używasz C, po prostu zamień CXX na C w wyżej wymienionych poleceniach. Możesz również zbadać właściwość VISIBLITY_INLINES_HIDDEN.

Dokumentacja dla GENERATE_EXPORT_HEADER zawiera dodatkowe wskazówki i przykłady dotyczące obu właściwości.

+1

Nie mogę znaleźć odpowiedniego przykładu. Czy mógłbyś rozwinąć? Przypuszczam, że będzie to dla C++ SET_TARGET_PROPERTIES (mytarget CXX_VISIBILITY_PRESET hidden) – Abai

+0

@Abai dalsze szczegóły dodane – Joe

+0

Dzięki @Joe, to działa świetnie! – Abai

4

Możesz dodać flagę do kompilatora CUpewnij tak:

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") 

aby upewnić się, że to zrobić tylko pod Linuksem można użyć tego kodu:

IF(UNIX) 
    IF(CMAKE_COMPILER_IS_GNUCC) 
     SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") 
    ENDIF(CMAKE_COMPILER_IS_GNUCC) 
ENDIF(UNIX) 
+0

W rzeczywistości -fvisibility = ukryta może być również używany z brzękiem, więc jeśli chcesz, aby móc korzystać z obu kompilatorów z tej funkcji można użyć coś takiego: if („$ {}” STREQUAL CMAKE_CXX_COMPILER_ID „GNU” OR "$ {CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") ... ENDIF() – piponazo

Powiązane problemy