CMakeLists.txt pour les fichiers C tiers dans le projet C ++

Mon projet C ++ doggo a un doggo/external/ pour le code tiers. Actuellement, il contient gtest et un CMakeLists.txt:

 # Google gtest for unit testing. add_subdirectory(gtest) message("gtest include dir: ${gtest_SOURCE_DIR}") include_directories(${gtest_SOURCE_DIR}) 

Mon doggo / CMakeLists.txt de niveau supérieur contient la ligne add_subdirectory(external) pour rechercher et créer les bibliothèques tierces. Tout fonctionne comme un charme – je peux inclure gtest avec #include . Maintenant, j’aimerais append la bibliothèque randomkit C à doggo/external/ , comme cela est fait ici: randomkit de numpy .

Comment puis-je obtenir randomkit pour construire mon doggo/external/ dir? À quoi devrait doggo/external/CMakeLists.txt ?

Je devrais alors pouvoir inclure les en-têtes C à utiliser dans mes fichiers x.cpp en incluant les en-têtes à l’intérieur d’un bloc extern "C" { ... } ( détails ici ).

MISE À JOUR : Comment installer randomkit ici? J’ai inclus une entrée CMakeLists.txt comme celle ci-dessus mais pour randomkit, et le répertoire ressemble à,

 external ├── CMakeLists.txt ├── gtest │ └── ... └── randomkit ├── CMakeLists.txt ├── dissortingbutions.c ├── dissortingbutions.h ├── randomkit.c └── randomkit.h 

et le randomkit/CMakeLists.txt :

 project(randomkit) file(GLOB SOURCES "*.c") add_library(randomkit SHARED ${SOURCES}) INSTALL( DIRECTORY ${CMAKE_SOURCE_DIR}/ DESTINATION "/usr/local/" #DESTINATION "" FILES_MATCHING PATTERN "*.h*") 

(deuxième DESTINATION a commenté pour montrer que j’ai aussi essayé)

Pourtant, lorsque doggo les étapes de construction de mon projet doggo niveau doggo une erreur s’est doggo la tentative d’ #include de #include :

 doggo/src/random_fooz.cpp:10:37: fatal error: randomkit/dissortingbutions.h: No such file or directory 

MISE À JOUR 2 : doggo / CMakeLists.txt:

 project(doggo) # Find and build third-party libraries add_subdirectory(external) # Add source dirs to the search path so cmake can find headers include_directories(${CMAKE_SOURCE_DIR}/include/) # Collect source files and build file(GLOB_RECURSE doggo_srcs ${CMAKE_SOURCE_DIR}/src/*.cpp) add_library(doggo ${doggo_srcs}) # Setup executables set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin/) add_subdirectory(exec) # Tests add_subdirectory(test) 

Dans le randomkit/CMakeLists.txt écrivez:

 project(randomkit) file(GLOB SOURCES "*.c") add_library(randomkit SHARED ${SOURCES}) target_include_directories(randomkit PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) INSTALL( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION "include" # this a the subdirectory with ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.h*") 

Dans le CMakeLists.txt principal, vous effectuez les opérations suivantes:

 add_library(doggo ${doggo_srcs}) target_link_libraries(doggo PUBLIC randomkit) target_include_directories(doggo PUBLIC ${CMAKE_SOURCE_DIR}/include/) 

N’utilisez pas include_directories .

Maintenant, comme la cible randomkit a la propriété PUBLIC avec les répertoires d’inclusion randomkit , ces répertoires d’inclusion seront automatiquement utilisés lors de la construction de la bibliothèque doggo. Et encore une fois, étant donné que la bibliothèque doggo a des répertoires et des bibliothèques inclus dans son interface publique, les exécutables que vous associez à doggo seront automatiquement liés à ces bibliothèques et trouveront leurs fichiers d’inclusion.

Notez que la commande INSTALL de randomkit/CMakeLists.txt est uniquement exécutée lorsque vous exécutez la cible d’installation. Lors de la construction, les fichiers d’inclusion doivent être trouvés dans l’arborescence source.