Импортированная цель CMake обнаружена при настройке, но сгенерирована build.make говорит target-NOTFOUND - PullRequest
0 голосов
/ 12 июня 2018

У меня есть простая общая библиотека libfool2.so с установленным заголовком fool2.h, которая не из проекта CMake.Мой проект my_temp1 зависит от fool2, поэтому я пишу FindFool2.cmake для создания импортируемой цели:

find_path(Fool2_INCLUDE_DIR fool2.h PATH_SUFFIXES fool2)
find_library(Fool2_LIB fool2)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Fool2
    REQUIRED_VARS Fool2_INCLUDE_DIR Fool2_LIB
)

if(Fool2_FOUND AND NOT TARGET Fool2::Fool2)
    add_library(Fool2::Fool2 SHARED IMPORTED)
    set_target_properties(Fool2::Fool2 PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "${Fool2_INCLUDE_DIR}"
        INTERFACE_LINK_LIBRARIES "${Fool2_LIB}"
    )
endif()

CMakeLists.txt для my_temp1 проекта:

cmake_minimum_required(VERSION 3.3)
project(my_temp1)

list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake/cmake_modules) 
# FindFool2.cmake is in ${CMAKE_CURRENT_LIST_DIR}/cmake/cmake_modules

find_package(Fool2 REQUIRED)

if (TARGET Fool2::Fool2)
    message(STATUS "target found")
endif()

add_executable(my_temp1 main.cpp)
target_link_libraries(my_temp1 Fool2::Fool2)

Сейчас

$ tree ../__install
../__install/
├── include
│   └── fool2
│       ├── fool2.h
│       └── version.h
└── lib
    └── libfool2.so
$ tree .
.
├── cmake
│   └── cmake_modules
│       └── FindFool2.cmake
├── CMakeLists.txt
└── main.cpp
$ cmake -H. -B_builds -DCMAKE_INSTALL_PREFIX=../__install
# some output omitted
-- target found
-- Configuring done
-- Generating done
-- Build files have been written to: /OMITTED/my_temp1/_builds
$ cmake --build _builds
CMakeFiles/my_temp1.dir/build.make:82: *** target pattern contains no '%'.  Stop.
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/my_temp1.dir/all' failed
make[1]: *** [CMakeFiles/my_temp1.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
$ head -n 85 _builds/CMakeFiles/my_temp1.dir/build.make | tail -n 10

# External object files for target my_temp1
my_temp1_EXTERNAL_OBJECTS =

my_temp1: CMakeFiles/my_temp1.dir/main.cpp.o
my_temp1: CMakeFiles/my_temp1.dir/build.make
my_temp1: Fool2::Fool2-NOTFOUND
my_temp1: CMakeFiles/my_temp1.dir/link.txt
    @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/OMITTED/my_temp1/_builds/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable my_temp1"
    $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/my_temp1.dir/link.txt --verbose=$(VERBOSE)

Команда $ cmake -H. -B_builds -DCMAKE_INSTALL_PREFIX=../__install находит fool2, поскольку команды find_ * также выполняют поиск в CMAKE_INSTALL_PREFIX.Но почему в build.make есть странный вывод my_temp1: Fool2::Fool2-NOTFOUND?

CMake версия 3.11.3

1 Ответ

0 голосов
/ 17 июня 2018

Для IMPORTED целевое значение библиотеки -NOTFOUND соответствует отсутствующему IMPORTED_LOCATION свойству, соответствующему пути библиотеки.Вам нужно установить это свойство для корректной работы с IMPORTED target.


Если вы хотите, чтобы CMake target был заполнителем только для связи с другими библиотеками, используйте INTERFACE цель библиотеки: у такой цели библиотеки нет расположения библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...