CMake:目标 Link 个库
CMake: Target Link Libraries
我如何link 库到正在制作的可执行文件?
如果这是一个简单的问题,请原谅,我是 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})
非常感谢。
set(EXECUTABLE_NAME ${PROJECT_NAME})
命令几乎没有用另一个变量 PROJECT_NAME
的值创建一个变量 EXECUTABLE_NAME
。它不会告诉 CMake 构建实际的可执行文件,因此您实际上应该使用 add_executable
。但是,它确实应该在 target_link_libraries
之前,尽管我不完全确定 CMake 不能处理相反的顺序。
If I attempt to make another executable using "add_executable", it
complains saying there is already one, so why can't CMake detect it?
您的问题似乎是由于您实际上在另一个 CMakeLists.txt
中有 add_executable
而引起的,该 CMakeLists.txt
位于您通过 [=18= 添加的 src
子目录中].您的问题的一种解决方案可能是将 target_link_libraries
移动到 CMakeLists.txt
在您的 src
目录中,并将 add_subdirectory(src)
移动到您显示的 CMakeLists.txt
的末尾:这样,在 src
子目录中的 CMakeLists.txt
中,您将可以访问父 CMakeLists.txt
中定义的所有变量 + CMake 应该停止抱怨无法使用 link 库,因为目标建立在另一个目录中。
我如何link 库到正在制作的可执行文件? 如果这是一个简单的问题,请原谅,我是 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})
非常感谢。
set(EXECUTABLE_NAME ${PROJECT_NAME})
命令几乎没有用另一个变量 PROJECT_NAME
的值创建一个变量 EXECUTABLE_NAME
。它不会告诉 CMake 构建实际的可执行文件,因此您实际上应该使用 add_executable
。但是,它确实应该在 target_link_libraries
之前,尽管我不完全确定 CMake 不能处理相反的顺序。
If I attempt to make another executable using "add_executable", it complains saying there is already one, so why can't CMake detect it?
您的问题似乎是由于您实际上在另一个 CMakeLists.txt
中有 add_executable
而引起的,该 CMakeLists.txt
位于您通过 [=18= 添加的 src
子目录中].您的问题的一种解决方案可能是将 target_link_libraries
移动到 CMakeLists.txt
在您的 src
目录中,并将 add_subdirectory(src)
移动到您显示的 CMakeLists.txt
的末尾:这样,在 src
子目录中的 CMakeLists.txt
中,您将可以访问父 CMakeLists.txt
中定义的所有变量 + CMake 应该停止抱怨无法使用 link 库,因为目标建立在另一个目录中。