SDL2d.dll在windows上找不到CMake使用fetchcontent



我正在与CMake的跨平台应用程序工作。该项目建立在Linux上,而不是windows上。如有任何帮助,不胜感激。

我得到的错误是一个弹出框,上面写着:

代码执行无法继续,因为没有找到SDL2d.dll。重新安装程序可以解决这个问题。

由于某些原因,CMake没有像linux那样将此目录设置为CMakeCache。

include(FetchContent)
message("Fetching SDL2...")
FetchContent_Declare(
SDL2
GIT_REPOSITORY https://github.com/libsdl-org/SDL.git
GIT_TAG release-2.26.3
)
FetchContent_MakeAvailable(SDL2)

正如您所看到的,我正在使用fetchcontent从存储库中获取此内容。我还认为重要的是要注意我正在使用pkgconfiglite包。我使用chocolatey软件包管理器安装了它。在获取SDL2内容时,我在输出

中看到此消息

pkg-config——static——libs sd12 "将返回无效信息

然后继续列出一堆SDL标志为on或off。我认为这可能是它的原因,但由于CMake似乎在底层使用pkgconfig,这一切似乎都像一个我不知道如何处理的黑盒子。

下面是我用来创建可执行文件和链接库的命令。

add_executable(${Target}
${SRC_FILES}
)
target_link_libraries(${Target}
Vulkan::Vulkan
SDL2::SDL2
)

问题解决。问题与pkg-config无关。

在开发跨平台应用程序时,我必须记住,Windows不像Linux那样为库和可执行文件提供专用位置。

通过我的旅程,我想出了两个解决方案。第二个解决方案要简单得多,而且对跨平台友好,但为了完整起见,我将两者都包括在内。

第一个需要将以下内容添加到add_executable()函数被调用。它使用生成器表达式"$<>"将SDL2 dll的位置复制到可执行文件的位置。生成器表达式在构建时求值。我的项目有一个库和一个可执行文件。当我试图将它添加到我的dll位置时,它不起作用。

if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
add_custom_command(
TARGET yourgame POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:SDL2::SDL2>" "$<TARGET_FILE_DIR:your_executable_name>"
VERBATIM
)
endif()

我的项目有一个库和一个可执行文件,但是当我试图将副本添加到我的库中时,上面的操作不起作用。

第二个<<p>/strong>方法要求我将所有的二进制文件移动到它们自己的文件夹"${CMAKE_BINARY_DIR}/bin">。这种方法将把您的二进制文件放在同一个文件夹中,而不考虑平台,从而实现更友好的跨平台体验。您到程序资产的路径将是相同的。不需要生成器表达式。我在我的基础CMakeLists.txt文件中添加了以下内容:
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

最新更新