CMake: целевые библиотеки ссылок - PullRequest
0 голосов
/ 28 июня 2018

Как я могу связать библиотеку с исполняемым файлом? Извините, если это простая проблема, я очень новичок для CMake.

Кажется, у меня проблемы с подключением VTK + QT к существующему проекту. Проблемы связаны со строками target_link_libraries, утверждая, что цель не встроена в каталог. Однако, это должно быть потому, что он создает исполняемый файл без дополнений (из-за set(EXECUTABLE_NAME ${PROJECT_NAME}) верно?). Если я пытаюсь создать другой исполняемый файл, используя add_executable, он жалуется, что он уже есть, так почему CMake не может его обнаружить?

После долгих поисков и поисков я могу только найти людей, которые используют add_executable после target_link_libraries. Так что, насколько я понимаю, это не относится к этому делу.

Вот CMakeFile.txt - объединение тока CMakeFile и CMakeFile из примеров VTK:

cmake_minimum_required(VERSION 3.0)

if(POLICY CMP0020)
    cmake_policy(SET CMP0020 NEW)
endif()

set(PROJECT_NAME "BRDFViz")
set(EXECUTABLE_NAME ${PROJECT_NAME})
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

project(
  ${PROJECT_NAME}
  VERSION 1.0
  LANGUAGES CXX
  )

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")

include(FindPackageHandleStandardArgs)

## Assimp
find_package(assimp REQUIRED)

# VTK
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})

## GLM
set(GLM_FIND_REQUIRED TRUE)
find_path(
  GLM_INCLUDE_DIRS "glm/glm.hpp"
  )
find_package_handle_standard_args(
  GLM
  DEFAULT_MSG
  GLM_INCLUDE_DIRS
  )

## libpng, PNG++
find_package(PNG REQUIRED)
set(png++_FIND_REQUIRED TRUE)
find_path(
  png++_INCLUDE_DIRS
  NAMES "png++/color.hpp" "png++/png.hpp"
  )
find_package_handle_standard_args(
  png++
  DEFAULT_MSG
  png++_INCLUDE_DIRS
  )

## libjpeg
find_package(JPEG REQUIRED)

## OpenEXR
find_package(OpenEXR REQUIRED)
add_subdirectory(src)

if(${VTK_VERSION} VERSION_GREATER "6" AND VTK_QT_VERSION VERSION_GREATER "4")
    set(CMAKE_AUTOMOC ON)
    find_package(Qt5Widgets REQUIRED)
else()
    message([FATAL_ERROR] "BRDFViz requires VTK 7 and QT 5 or higher. \n Exiting processing and generation") 
endif()

 include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
file(GLOB UI_FILES *.ui)
file(GLOB QT_WRAP *.h)
if(${VTK_VERSION} VERSION_GREATER "6" AND VTK_QT_VERSION VERSION_GREATER "4")
    qt5_wrap_ui(UISrcs ${UI_FILES})
    target_link_libraries(${PROJECT_NAME} Gt5::Core Qt5::Gui) 
else()
    message([FATAL_ERROR] "BRDFViz requires VTK 7 and QT 5 or higher. \n Exiting processing and generation")
endif()

target_link_libraries(${PROJECT_NAME} ${VTK_LIBRARIES})

Большое спасибо.

1 Ответ

0 голосов
/ 28 июня 2018
Команда

set(EXECUTABLE_NAME ${PROJECT_NAME}) едва создает переменную EXECUTABLE_NAME со значением другой переменной, PROJECT_NAME. Он не говорит CMake о создании реального исполняемого файла, поэтому вы должны использовать add_executable. Тем не менее, он действительно должен идти до target_link_libraries, хотя я не совсем уверен, что CMake не может обработать противоположный порядок.

Если я попытаюсь сделать другой исполняемый файл с помощью «add_executable», он жалуется, говоря, что он уже есть, так почему CMake не может его обнаружить?

Похоже, что ваша проблема вызвана тем, что у вас есть add_executable в другом CMakeLists.txt, который находится в вашем подкаталоге src, который вы добавляете через add_subdirectory(src). Одним из решений вашей проблемы может быть перемещение target_link_libraries в CMakeLists.txt в вашем каталоге src, а также перемещение add_subdirectory(src) в конец CMakeLists.txt, который вы показали: таким образом в CMakeLists.txt, который находится внутри * В подкаталоге 1022 * у вас будет доступ ко всем переменным, определенным в родительском CMakeLists.txt + CMake должен перестать жаловаться на невозможность связать библиотеки, так как цель встроена в другой каталог.

...