Как включить две разные версии одной и той же зависимости в проект CMake? - PullRequest
2 голосов
/ 10 октября 2019

В моей системе присутствует ExternalProject обеих версий 1.2 и 2.2. ExternalProject - это проект CMake, и CMake без проблем находит обе версии, когда я их запрашиваю. Команда find_package(ExternalProject 1.2 EXACT) находит версию 1.2, а find_package(ExternalProject 2.2 EXACT) находит версию 2.2.

Версии 1 и 2 не совместимы друг с другом. API совершенно разные.

У меня есть проект CMake, MyProject, который имеет две цели, targetOne и targetTwo. TargetOne использует ExternalProject 1.2, а TargetTwo использует ExternalProject 2.2.

Приведенный ниже код не делает то, что я хочу. Одна и та же внешняя зависимость не просматривается дважды. Компиляция TargetTwo не удалась. CMake поддерживает этот сценарий в любом случае? (кроме переименования версии ExternalProject 2 и компиляции его в другом месте).

project(MyProject)

find_package(ExternalProject 1.2 EXACT)
add_executable(targetOne target_one.c)
target_link_libraries(targetOne ExternalProject::externalProject)

find_package(ExternalProject 2.2 EXACT)
add_executable(targetTwo target_two.c)
target_link_libraries(targetTwo ExternalProject::externalProject)

1 Ответ

2 голосов
/ 11 октября 2019

Вы не можете смешивать цели с одинаковыми именами в одном и том же CMakeLists.txt. Используйте разные CMakeLists.txt - по одному для каждого исполняемого файла target. Для этого используйте add_subdirectory.

  • project ./CMakeLists.txt:
project(MyProject)
add_subdirectory(folder_one)
add_subdirectory(folder_two)
  • . / Folder_one / CMakeLists. txt:
find_package(ExternalProject 1.2 EXACT)
add_executable(targetOne target_one.c)
target_link_libraries(targetOne ExternalProject::externalProject)
  • . / folder_two / CMakeLists.txt:
find_package(ExternalProject 2.2 EXACT)
add_executable(targetTwo target_two.c)
target_link_libraries(targetTwo ExternalProject::externalProject)

Также, для изменения объема вы можетеиспользуйте function

...