2015-04-16 9 views
8

Mam tylko nagłówek C++ 11 biblioteki, więc chcę go skonfigurować, używając CUpewnij> 3.1, kompilacja cech wydaje się rozsądny sposób, aby to zrobić:Jak zdefiniować przechodnia CXX_STANDARD C++ 11 w CUpewnij

target_compile_features(my_header_lib INTERFACE cxx_range_for) 

Ale wolałbym nie wskazywać poszczególnych funkcji, ale tylko C++ 11 lub C++ 14. Wtedy mógłbym spróbować użyć następujących:

set_property(TARGET my_target PROPERTY CXX_STANDARD 11) 

Problemem jest to, że my_target nie może być INTERFEJS tutaj, to nie jest obsługiwany i nie można zdefiniować go PUBLIC, więc konsumentów (wiele eks) mojego nagłówka tylko woli biblioteki automatycznie propagowana jest konfiguracja C++ 11 z biblioteki.

Czy jest jakiś sposób zdefiniowania na wysokim poziomie standardu 11/14, ale także skonfigurować go dla biblioteki tylko nagłówkowej (INTERFEJS)? Wolałbym nie powracać do starego podręcznika -std = C++ 11.

+1

W rzeczywistości jest to świadomy wybór projektu, który nie obsługuje właściwości celu "INTERFACE_CXX_STANDARD". Zobacz także zmienną 'CMAKE_CXX_STANDARD'. – steveire

Odpowiedz

2

CMake 3.8 (wydana w kwietniu 2017) wprowadził meta cechy (np cxx_std_11, cxx_std_14, cxx_std_17). Możesz teraz na przykład napisać:

target_compile_features(my_header_lib INTERFACE cxx_std_11) 
4

Najprostszym rozwiązaniem na razie jest ręczne utrzymywanie list funkcji C++ 11 i C++ 14 w zmiennej globalnej i przesyłanie tej listy do target_compile_features.

set(CXX11_FEATURES 
    cxx_auto_type 
    cxx_constexpr 
    [...] 
) 

set(CXX14_FEATURES 
    cxx_generic_lambdas 
    [...] 
) 

target_compile_features(my_header_lib INTERFACE ${CXX11_FEATURES} ${CXX14_FEATURES}) 

Byłoby miło, gdyby CMake już dostarczył te listy, ale obecnie tak się nie dzieje.

Należy zauważyć, że jest to zgodne z tym, jak mechanizm funkcji kompilacji działa obecnie w CMake. Właściwość CXX_STANDARD określa, która flaga jest podana kompilatorowi w wierszu poleceń. Tylko dlatego, że żądasz określonej standardowej wersji, nie gwarantuje jednak, że poprawnie skompiluje określoną funkcję. Jedynym sposobem, aby upewnić się, że dana funkcja jest obecna (i zawieść przy znaczącym błędzie, jeśli nie jest), jest sprawdzenie jej przez target_compile_features.

Komplikacja w tym przypadku nie wynika z tego, jak CMake radzi sobie ze sprawami, ale z powodu tego, że różne kompilatory implementują różne podzbiory standardu.

+0

Tak, to jest dobre podejście, myślę. I tak, myślę, że byłoby dobrym pomysłem, żeby CMake zdefiniował dla nas listy. Jest jeszcze mały problem, jest to, że parametry target_compile_features wydają się nie być w pełni zaimplementowane dla kompilatorów jako MinGW, i dostaję pewne błędy, mimo że wydaje się to rozwiązane w https://public.kitware.com/Bug/view.php ? id = 15443. Spróbuję tego i w razie potrzeby opublikuję kolejne pytanie. – drodri

+1

@drodri Tak, 'target_compile_features' nie jest teraz bardzo niezawodny. IIRC działa tylko z najnowszymi wersjami gcc i clang w tej chwili. Mam nadzieję, że wkrótce zostanie rozwiązany, ponieważ generalnie jest to bardzo fajna funkcja CMake. – ComicSansMS

+1

Lista funkcji znanych kompilatorowi znajduje się w http://www.cmake.org/cmake/help/v3.2/variable/CMAKE_CXX_COMPILE_FEATURES.html#variable:CMAKE_CXX_COMPILE_FEATURES. GCC 4.4 jest najstarszą obsługiwaną wersją GCC, wersją Clang dostarczaną z Xcode 4.0 i MSVC 2010. Te są stare. Nie jest prawdą, że obsługiwane są tylko najnowsze kompilatory. – steveire