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.