【问题标题】:Executable can't find SDL2.dll可执行文件找不到 SDL2.dll
【发布时间】:2020-12-18 05:22:38
【问题描述】:

我一直在试图弄清楚为什么 CMake 没有添加 SDL2 的静态库。如果我在可执行文件旁边添加 SDL2.dll 文件,那么它确实可以工作。

它构建得很好,并且可以很容易地找到标题。

The error

我的 CMakeList.txt 看起来像这样。相信我,我已经尝试了所有方法,但很明显我做错了什么。

cmake_minimum_required(VERSION 3.7)
set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

SET(SDL2_DIR ./lib)

project(SDL2Test)

find_package(SDL2 REQUIRED)
include_directories(SDL2Test ${SDL2_INCLUDE_DIRS})

add_executable(SDL2Test Main.cpp)
target_link_libraries(SDL2Test ${SDL2_LIBRARIES})

这是 sdl2-config.cmake:

set(SDL2_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/../include")

# Support both 32 and 64 bit builds
if (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
    set(SDL2_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/x64/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/x64/SDL2main.lib")
else ()
    set(SDL2_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/x86/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/x86/SDL2main.lib")
endif ()

string(STRIP "${SDL2_LIBRARIES}" SDL2_LIBRARIES)

这是 Main.cpp

#include "SDL.h"

using namespace std;

int main(int argc, char *argv[])
{
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window *window = SDL_CreateWindow(
            "SDL2Test",
            SDL_WINDOWPOS_UNDEFINED,
            SDL_WINDOWPOS_UNDEFINED,
            640,
            480,
            0
    );

    SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE);
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
    SDL_RenderClear(renderer);
    SDL_RenderPresent(renderer);

    SDL_Delay(3000);

    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}

【问题讨论】:

  • ${CMAKE_CURRENT_LIST_DIR}/x64/SDL2.libstatic 库还是 import 库(没有 .dll 就无法工作)?
  • 你使用什么编译器? .lib 提示 MSVC,对吗?
  • 谢谢大家的回答!是的,我正在使用 MSVC @HolyBlackCat
  • @Tsyvarev 它应该是导入库,因为没有它应用程序就无法运行。为了使程序运行,我必须复制 .dll 并将其放在可执行文件旁边。

标签: c++ cmake sdl-2 clion


【解决方案1】:

您的 SDL2.lib 是导入库,需要在运行时附带 DLL。

要使用静态库(与您的 EXE 完全链接且不需要 DLL 的库),您需要自己构建 SDL2.lib 的静态版本。

请记住,这是discouraged by the author of SDL

【讨论】:

  • 有趣。对于 MinGW,它们提供了一个开箱即用的适当静态库,以及一个动态库。
  • MinGW 确实如此。我正在尝试实现跨平台支持,这就是我选择 MSVC 的原因
  • 我正在尝试实现您的第一个解决方案。如何让 CMake 为可执行文件构建 .dll?我认为 target_link_libraries 就足够了@PiotrK
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 2022-01-04
  • 2012-08-24
  • 2019-11-02
相关资源
最近更新 更多