2013-06-13 17 views
20

C++ ile çapraz platform yazılımı geliştirdim. Bildiğim gibi, Linux .so tüm sembolleri varsayılan olarak "gcc -fvisibility=hidden" aracılığıyla dışa aktardı. Aktarılan tüm sembolleri gizli olarak ayarlayabilir, daha sonra dışa aktarmak istediğim sınıf ve işlev için __attribute__(visibility("default"))'u ayarlayabilirim, böylece vermek istediklerimi kontrol edebilirim.Paylaşılan bir kütüphanenin dışa aktarılan sembolünü kontrol ederken CMake eşdeğeri "gcc -fvisibility = hidden" ne demektir?

Soruma göre, CMake kullanarak, işi "gcc -fvisibility = hidden" denetimi olarak nasıl yapabilirim?

Böyle CKağıt derleyiciye bir bayrak ekleyebilirsiniz

cevap

39

:

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

bu sadece bu kodu kullanabilirsiniz Linux altında yapılan emin olmak için doğrudan, geçerli bir CMake sürümü ve bunun yerine <LANG>_VISIBILITY_PRESET özelliklerini kullanmalısınız. Bu şekilde CMakeList'lerinizdeki derleyici özelliklerini önleyebilir ve çapraz platform uygulanabilirliğini geliştirebilirsiniz (GCC'yi desteklememek ve Clang'ı desteklememek gibi hataları önlemek).

yanı, size belirli bir kütüphaneden veya yürütülebilir hedefe ayarı sınırlamak için set_target_properties(MyTarget PROPERTIES CXX_VISIBILITY_PRESET hidden) set(CMAKE_CXX_VISIBILITY_PRESET hidden) küresel özelliğini ayarlamak için arayabilir veya ediyorum ya C++ kullanarak eğer. Eğer C kullanıyorsanız, yukarıda belirtilen komutlarda CXX'i C ile değiştirin. Ayrıca VISIBLITY_INLINES_HIDDEN özelliğini de araştırmak isteyebilirsiniz.

GENERATE_EXPORT_HEADER belgeleri, her iki özellikle ilgili daha fazla ipucu ve örnek içerir. Aslında

+1

Bunun için uygun bir örnek bulamıyorum. Detaylandırır mısınız? Tahminim C++ SET_TARGET_PROPERTIES (mytarget CXX_VISIBILITY_PRESET gizli) – Abai

+0

@Abai için daha fazla ayrıntı ekledi – Joe

+0

Teşekkürler @Joe, bu harika çalışıyor! – Abai

4

: derleyici bayrakları ayarlamak yerine

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

, -fvisibility = Sen gibi bir şey kullanabileceğiniz bu özelliği ile her iki derleyiciler kullanmak mümkün istiyorum eğer öyleyse de clang kullanılabilir gizli: IF ("$ {CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" VEYA "$ {CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") ... ENDIF() – piponazo

İlgili konular