2016-03-23 14 views
10

Miałem projekt, który używa CMake jako narzędzia do kompilacji i stworzył prosty szablon dla mnie i moich współpracowników do wykorzystania. Kiedy szukałem najlepszych i łatwych w użyciu praktyk online, natknąłem się na różne podejścia do tworzenia biblioteki.Dlaczego dodawać pliki nagłówkowe do polecenia ADD_LIBRARY/ADD_EXECUTABLE w CMake

W tym szablonie wymieniono pliki nagłówkowe i pliki źródłowe w dwóch oddzielnych zmiennych i nie przekazuję nagłówków do polecenia add_library - tylko źródła. A następnie używam zmiennej set_target_properties ze zmienną PUBLIC_HEADER, aby podać listę plików nagłówkowych.

Do tej pory wydaje się działać, ale zastanawiam się, czy robię coś niepotrzebnie skomplikowane. Niektóre osoby w Internecie przekazują pliki nagłówkowe do polecenia add_library i nie używają nawet set_target_properties i innych.

W skrócie:

  • powinniśmy Dołącz nagłówek pliki add_library czy nie powinniśmy (jako najlepszej praktyki)? I wpływ obu zastosowań.
  • jaki jest cel obsługiwany przez dodanie nagłówków w add_library/add_executable? Wydaje się, że działają nawet bez niego (wydaje się tylko deklaracja i symbole). proszę potwierdzić ze zrozumieniem.

(Oto szablon mówię :)

cmake_minimum_required(VERSION 3.1.0) 

project(lae CXX C) 
set(CMAKE_CXX_STANDARD 14) 

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR} 
) 

set(SOURCE_FILES 
    ... 
) 

set(HEADER_FILES 
    ... 
) 

set(PRIVATE_HEADER_FILES 
    ... 
) 

add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES}) 

set(REQUIRED_LIBRARIES 
    ... 
) 

target_link_libraries(${PROJECT_NAME} ${REQUIRED_LIBRARIES}) 

SET_TARGET_PROPERTIES( 
    ${PROJECT_NAME} 
PROPERTIES 
    FRAMEWORK ON 
    SOVERSION 0 
    VERSION 0.1.0 
    PUBLIC_HEADER "${HEADER_FILES}" 
    PRIVATE_HEADER "${PRIVATE_HEADER_FILES}" 
    ARCHIVE_OUTPUT_DIRECTORY "lib" 
    LIBRARY_OUTPUT_DIRECTORY "lib" 
    OUTPUT_NAME ${PROJECT_NAME} 
) 

Odpowiedz

4

w naszych projektach używamy "prosty" sposób do Ciebie - add_library z obu nagłówków i źródeł.

Jeśli dodasz tylko źródła, nie zobaczysz nagłówków w projekcie wygenerowanym przez IDE.

Jednak podczas instalacji, co musimy zrobić to w ten sposób, za pomocą dwóch install polecenia:

install(TARGETS library_name 
     LIBRARY DESTINATION lib) 

install(FILES ${PUBLIC_HEADERS} 
     DESTINATION include/library_name) 

Jeśli chcesz zrobić to za pomocą jednego polecenia, można użyć set_target_properties z PUBLIC_HEADER, jak sugeruje . Następnie, tego rodzaju install jest możliwa:

install(TARGETS library_name 
     LIBRARY DESTINATION lib 
     PUBLIC_HEADER DESTINATION include/library_name) 

Wybierz ten, który najbardziej lubisz i trzymać się go.

+0

Podobało mi się sposób połączenia obu! Ponadto zobaczyłem rzecz, o której wspomniałeś (pliki projektu pomijają nagłówek), gdy opcja eksportu użyła Eclipse CDT. Myślę, że pozostanę przy twoim rozwiązaniu. Dzięki! –

+0

Drugi sposób "instalacji" nie wydaje się działać, kiedy "nagłówki" dodane/nie dodane w add_library. Narzeka na 'nie określono celów, nie znaleziono pliku Makef' w czasie budowy. jakaś wskazówka? – parasrish

+0

@parasrish Jeśli nie zdefiniujesz swoich nagłówków komendą SET_TARGET_PROPERTIES, ponieważ nie zdefiniujesz nagłówków, to nie będzie działać. Jeśli jednak SET_TARGET_PROPERTIES z "Publicznymi nagłówkami" są poprawnie ustawione, instalacja docelowa powinna działać poprawnie. –

Powiązane problemy