【问题标题】:CMake: Target Link LibrariesCMake:目标链接库
【发布时间】:2018-06-28 14:48:47
【问题描述】:

如何将库链接到正在生成的可执行文件? 如果这是一个简单的问题,请原谅,我是 CMake 的非常新的

我似乎在将 VTK+QT 附加到现有项目时遇到问题。问题在于target_link_libraries 行,声称目标未构建在目录中。但是,这一定是因为它构建了一个没有添加的可执行文件(由于set(EXECUTABLE_NAME ${PROJECT_NAME}) 对吗?)。 如果我尝试使用add_executable 制作另一个可执行文件,它会抱怨说已经有一个,那么为什么 CMake 不能检测到它呢?

在这里进行了多次谷歌搜索和抓取后,我似乎只能找到在target_link_libraries 之后使用add_executable 的人。据我所知,这不适用于本案。

这是CMakeFile.txt - 这是当前CMakeFile 和VTK 示例中的CMakeFile 的合并:

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})

非常感谢。

【问题讨论】:

  • 您是否在src/ 子目录(在其CMakeLists.txt)中创建可执行目标?然后您应该将target_link_libraries 放在您创建目标的脚本中。正是 CMake 在错误消息中告诉你的。

标签: qt cmake vtk


【解决方案1】:

set(EXECUTABLE_NAME ${PROJECT_NAME}) 命令几乎不会使用另一个变量PROJECT_NAME 的值创建一个变量EXECUTABLE_NAME。它不会告诉 CMake 构建一个实际的可执行文件,因此您实际上应该使用 add_executable。但是,它确实应该在 target_link_libraries 之前进行,尽管我不完全确定 CMake 不能处理相反的顺序。

如果我尝试使用“add_executable”创建另一个可执行文件,它 抱怨说已经有一个,那为什么 CMake 检测不到呢?

您的问题似乎是由于您实际上在另一个CMakeLists.txt 中拥有add_executable,该CMakeLists.txt 位于您通过add_subdirectory(src) 添加的src 子目录中。您的问题的一种解决方案可能是将target_link_libraries 移动到您的src 目录中的CMakeLists.txt,并将add_subdirectory(src) 移动到您已显示的CMakeLists.txt 的末尾:在CMakeLists.txt 中以这种方式在@ 内987654336@ 子目录,您将有权访问父 CMakeLists.txt 中定义的所有变量 + CMake 应该停止抱怨无法链接库,因为目标构建在另一个目录中。

【讨论】:

  • 非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多