cmake - CMake 多配置生成器使用错误的构建目录
问题描述
我有一个与 CMake 中的多配置生成器有关的问题。任务很简单:我只想将一些文件(glsl 着色器)复制到运行时目录中(以便在运行时读取可执行文件)。
我有以下目标层次结构:我有库(DLL)目标和可执行文件,将由 user 创建。然后库与可执行文件链接。这就是问题所在。我使用了以下代码:
configure_file("${SHADER_SRC}" "${CMAKE_RUNTIME_OUTPUT_DIR}/shaders/${SHADER_OUTPUT_FILENAME}" COPYONLY)
它生成类似于以下内容的构建树:
- 二进制目录
- BUILD_TYPE(例如,调试)
- 垃圾桶
- 着色器
- 我的文件在这里。工作正常
- 其他目标
- 着色器
- 垃圾桶
- BUILD_TYPE(例如,调试)
它适用于单配置生成器。但是当我开始使用Visual Studio 16 2019
多配置生成器时,会发生以下情况:
- 二进制目录
- BUILD_TYPE
- 垃圾桶
- 着色器
- 我的文件在这里。工作正常
- BUILD_TYPE
- 可执行文件不再看到其他目标着色器,因为它们位于错误的目录中。如何解决这个问题?
- 着色器
- 垃圾桶
- BUILD_TYPE
PS我也使用add_custom_command
过版本:
set(SHADER_OUTPUT_FILENAME "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/shaders/${SHADER_FILENAME}")
add_custom_command(
TARGET ${LIBRARY_TARGET_NAME} PRE_BUILD
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT "Copying shader (${SHADER_FILENAME}) to build directory..."
BYPRODUCTS "${SHADER_OUTPUT_FILENAME}"
COMMAND ${CMAKE_COMMAND} -E copy
${SHADER_SRC} # Shader file in source directory
${SHADER_OUTPUT_FILENAME} # Shader file that I need in build directory
VERBATIM
)
解决方案
if(UNIX)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
# for multi-config build system (e.g. xcode, ninja-multiconfig)
foreach(OUTPUTCONFIG IN LISTS CMAKE_CONFIGURATION_TYPES)
string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_BINDIR})
endforeach()
else()
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
# for multi-config builds (e.g. msvc)
foreach(OUTPUTCONFIG IN LISTS CMAKE_CONFIGURATION_TYPES)
string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_BINDIR})
endforeach()
endif()
推荐阅读
- javascript - 我可以使用 Javascript 将多个音频文件混合成一个音频吗?
- c++ - Qt:使用visual studio开发时在哪里可以找到.pro文件
- python - 如何从项目目录中的文件导入?
- python-3.x - WinError 5:为 Python 安装 pip numba 和 librosa 时拒绝访问
- python - 为什么方法解析顺序会影响我的代码的行为?
- python - 使用 Panda,根据 ID 列表和新值更新列值
- c# - 使用 Process.Start 在 C# 中传递 powershell 多个参数
- java - 将代码python转换为Java,找到达到1的最小步骤数
- azure - 复制文件任务未复制到 Azure 存储库
- ajax - ajax get方法一数据为null怎么处理