get_filename_component получает неправильное имя файла

#cmake

#cmake

Вопрос:

Это ошибка CMake, или у меня может быть ошибка? Кто-нибудь может указать, как устранить проблему? Любая помощь будет принята с благодарностью.

Во-первых, я перечислил DLL-файлы стороннего целевого объекта. Я верю, что все в порядке.

 project(assimp)

add_library(${PROJECT_NAME} SHARED IMPORTED GLOBAL)

set(ASSIMP_ROOT ${CMAKE_CURRENT_LIST_DIR})

set(ASSIMP_NAME "assimp-vc142-mt")

set_target_properties(${PROJECT_NAME} PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES   "${ASSIMP_ROOT}/include"
        IMPORTED_IMPLIB_RELEASE         "${ASSIMP_ROOT}/lib/${ASSIMP_NAME}.lib"
        IMPORTED_IMPLIB_DEBUG           "${ASSIMP_ROOT}/lib/${ASSIMP_NAME}d.lib"
        IMPORTED_LOCATION_RELEASE       "${ASSIMP_ROOT}/bin/${ASSIMP_NAME}.dll"
        IMPORTED_LOCATION_DEBUG         "${ASSIMP_ROOT}/bin/${ASSIMP_NAME}d.dll")
  

Затем я захотел использовать эту библиотеку, и возникла проблема.

 cmake_minimum_required(VERSION 3.15)

include(cmake/Functions.cmake)

project(my_show_case)

add_subdirectory(thirdparty)

add_executable(${PROJECT_NAME})

file(GLOB_RECURSE srcs ${CMAKE_CURRENT_LIST_DIR}/include/*.h ${CMAKE_CURRENT_LIST_DIR}/src/*.cpp)

target_sources(${PROJECT_NAME} PUBLIC ${srcs})

target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include/)

get_property(ASSIMP_DEBUG_LIB TARGET assimp PROPERTY IMPORTED_LOCATION_DEBUG)
get_property(ASSIMP_RELEASE_LIB TARGET assimp PROPERTY IMPORTED_LOCATION_RELEASE)

# This section would get a wrong file name which has a '>' suffix
set(MY_Lib $<$<CONFIG:Debug>:${ASSIMP_DEBUG_LIB}>$<$<CONFIG:Release>:${ASSIMP_RELEASE_LIB}>)
get_filename_component(FILENAME "${MY_Lib}" NAME)
# prints: "assimp-vc142-mt.dll>"
file(GENERATE OUTPUT TestOut.txt CONTENT "${FILENAME}")
  

Файл TestOut.txt бы напечатал «assimp-vc142-mt.dll >», как вы можете видеть, у него есть суффикс «>».

Комментарии:

1. get_filename_component разрешается во время настройки, а не во время сборки. Выражения генератора не будут работать.

2. @KamilCuk о, в этом дело! Большое спасибо!! Кстати, как я могу справиться с этой ситуацией?

3. «как я могу справиться с этой ситуацией?» — Просто используйте отдельные вызовы get_filename_component , один для ASSIMP_DEBUG_LIB и один для ASSIMP_RELEASE_LIB . Затем объедините результаты с выражениями генератора, как вы делаете в MY_Lib переменной.

4. @Tsyvarev понял и очень признателен. Просто разделите функцию времени сборки и функцию времени выполнения, чтобы заставить ее работать