Pour mon projet, je dois construire et inclure une autre bibliothèque, https://github.com/t- dillon/tdoku/, comme ma dépendance.

Toku est également construit à l'aide de CMake, et il existe un script de construction que je peux exécuter en faisant :

$ cd lib/toku
$ ./BUILD.sh

Cela place le fichier de bibliothèque dans ./lib/tdoku/build/libtdoku.a.

J'essaie de créer la bibliothèque Toku dans CMake et de l'utiliser comme dépendance. Comment puis-je faire ceci?

J'ai essayé d'utiliser add_custom_target, add_custom_command, add_dependencies, add_subdirectory en vain.

Mon CMakeLists.txt actuel ressemble à :

cmake_minimum_required(VERSION 3.17)
project(project_1_cpp)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wconversion")
set(CMAKE_CXX_FLAGS_DEBUG_INIT "")
set(CMAKE_CXX_FLAGS_RELEASE_INIT "-O3")

add_custom_target(toku)
add_custom_command(
  TARGET toku
  COMMAND ${CMAKE_SOURCE_DIR}/lib/tdoku/BUILD.sh
  WORKING_DIR ${CMAKE_SOURCE_DIR}/lib/tdoku
)

file(GLOB project_1_src "*.cpp")
add_executable(project_1_cpp ${project_1_src})
add_dependencies(tdoku project_1_cpp)
target_link_libraries(project_1_cpp ${CMAKE_SOURCE_DIR}/lib/tdoku/build/libtdoku.a)
0
simonzack 5 sept. 2020 à 14:14

1 réponse

Meilleure réponse

Avec l'aide de @Tsyvarev, j'ai d'abord modifié mon CMakeLists.txt pour inclure :

add_custom_command(
  OUTPUT ${CMAKE_SOURCE_DIR}/lib/tdoku/build/libtdoku.a
  COMMAND ${CMAKE_SOURCE_DIR}/lib/tdoku/BUILD.sh tdoku
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/lib/tdoku
)
add_custom_target(project DEPENDS ${CMAKE_SOURCE_DIR}/lib/tdoku/build/libtdoku.a)

La clé est que WORKING_DIR ne fonctionne pas, et j'ai besoin d'avoir WORKING_DIRECTORY à la place. J'ai compris cette partie en essayant de modifier le script build.sh et en lui faisant imprimer des éléments dans un fichier, afin que je puisse savoir s'il est en cours d'exécution et ce qui se passe dans le script. J'ai réalisé que le répertoire de travail du script était erroné.

En fait, je pense avoir fait tout cela avant de poster la question, mais j'ai eu les erreurs suivantes après, ce qui m'a amené à penser que la bibliothèque tdoku ne se compilait pas correctement. C'était le cas, mais le lien avec mon projet était incorrect :

/usr/bin/ld: /usr/bin/ld: DWARF error: could not find variable specification at offset 223f
/usr/bin/ld: DWARF error: could not find variable specification at offset 22ba

J'ai googlé "DWARF error: could not find variable specification", ce qui m'a conduit à ld.exe : erreur DWARF : impossible de trouver la spécification de variable à l'offset 101cee. La recherche sur Google cmake flto m'a conduit à Comment puis-je activer l'optimisation du temps de liaison (LTO) avec CMake ?.

Cela m'a finalement permis de compiler mon projet.

La liste complète des modifications comprend :

set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)

add_custom_command(
  OUTPUT ${CMAKE_SOURCE_DIR}/lib/tdoku/build/libtdoku.a
  COMMAND ${CMAKE_SOURCE_DIR}/lib/tdoku/BUILD.sh tdoku
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/lib/tdoku
)
add_custom_target(project DEPENDS ${CMAKE_SOURCE_DIR}/lib/tdoku/build/libtdoku.a)
1
simonzack 5 sept. 2020 à 13:49