Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CMake获取、构建和链接SDL2失败,引用未定义'floor'_Cmake_Sdl 2_Libm - Fatal编程技术网

使用CMake获取、构建和链接SDL2失败,引用未定义'floor'

使用CMake获取、构建和链接SDL2失败,引用未定义'floor',cmake,sdl-2,libm,Cmake,Sdl 2,Libm,当我将我的程序与SDL2链接时,出现以下错误 /usr/bin/ld: ../_deps/sdl2_content-build/libSDL2d.a(SDL_stdlib.c.o): in function `SDL_floor_REAL': /home/user/myprogram/cmake-build-debug/_deps/sdl2_content-src/src/stdlib/SDL_stdlib.c:247: undefined reference to `floor' 我制作了一

当我将我的程序与SDL2链接时,出现以下错误

/usr/bin/ld: ../_deps/sdl2_content-build/libSDL2d.a(SDL_stdlib.c.o): in function `SDL_floor_REAL':
/home/user/myprogram/cmake-build-debug/_deps/sdl2_content-src/src/stdlib/SDL_stdlib.c:247: undefined reference to `floor'
我制作了一个FetchSDL2.cmake文件,其中包含了理论上应该获取、构建和使用它的文件:

FetchContent_Declare(
    sdl2_content
    URL https://www.libsdl.org/release/SDL2-2.0.12.tar.gz
    URL_HASH MD5=783b6f2df8ff02b19bb5ce492b99c8ff
)

FetchContent_GetProperties(sdl2_content)
if(NOT sdl2_content_POPULATED)
  FetchContent_Populate(sdl2_content)
  if(ANDROID)
      set(SDL_SHARED ON CACHE BOOL "shared")
      set(SDL_STATIC ON CACHE BOOL "static")
      add_subdirectory(${sdl2_content_SOURCE_DIR} ${sdl2_content_BINARY_DIR} EXCLUDE_FROM_ALL)
      add_library(SDL2::SDL2 ALIAS SDL2)
      add_library(SDL2::SDL2main ALIAS SDL2main)
  elseif(WIN32 OR LINUX OR MACOS)
      set(SDL_SHARED OFF CACHE BOOL "no shared")
      set(SDL_STATIC ON CACHE BOOL "static")
      set(SDL_STATIC_PIC ON CACHE BOOL "Static version of the library should be built with Position Independent Code")
      set(SDL_SHARED OFF)
      set(SDL_STATIC ON)
      set(SDL_STATIC_PIC ON)
      set(FORCE_STATIC_VCRT ON CACHE BOOL "static windows static vcrc")
      add_subdirectory(${sdl2_content_SOURCE_DIR} ${sdl2_content_BINARY_DIR} EXCLUDE_FROM_ALL)
      add_library(SDL2::SDL2 ALIAS SDL2-static)
      add_library(SDL2::SDL2main ALIAS SDL2main)
  endif()

  if(NOT EXISTS "${sdl2_content_BINARY_DIR}/include/SDL2")
      execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${sdl2_content_SOURCE_DIR}/include ${sdl2_content_BINARY_DIR}/include/SDL2)
  endif()

  find_package(LibM)
  set(SDL2_INCLUDE_HINTS "${sdl2_content_BINARY_DIR}/include/" "${sdl2_content_BINARY_DIR}/include/SDL2/")
  set(SDL2_LIB_HINTS "${sdl2_content_BINARY_DIR}/")
  find_package(SDL2)
  list(APPEND SDL2_INCLUDE_DIRS "${sdl2_content_BINARY_DIR}/include/SDL2/")
  list(APPEND SDL2_INCLUDE_DIRS "${sdl2_content_BINARY_DIR}/include/")
  list(APPEND SDL2_INCLUDE_DIRS "${LIBM_INCLUDE_DIRS}")
  list(APPEND SDL2_LIBRARY_DIRS "${sdl2_content_BINARY_DIR}/")
  list(APPEND SDL2_LIBRARIES SDL2::SDL2)
  list(APPEND SDL2_LIBRARIES "${LIBM_LIBRARIES}")
endif()
但我一直得到上面的错误。我有LibM,其他数学函数都链接正确。我在Ubuntu 20.04上


您能否帮助修复此问题,使其正确获取SDL2?我之所以不安装它,是因为CMake将在一些没有包管理器的平台上使用此脚本。

我发现了这一点。原来SDL2有两个同名的头
SDL_config.h
。您希望包含的是CMake生成的,而不是库附带的

下面是我的CMake文件,它正确地删除和安装了正确的头文件。使用SDL 2.0.12进行测试

FetchContent_Declare(
    sdl2_content
    URL https://www.libsdl.org/release/SDL2-2.0.12.tar.gz
    URL_HASH MD5=783b6f2df8ff02b19bb5ce492b99c8ff
)

FetchContent_GetProperties(sdl2_content)
if(NOT sdl2_content_POPULATED)
    FetchContent_Populate(sdl2_content)
    if(ANDROID)
        set(SDL_SHARED ON CACHE BOOL "shared")
        set(SDL_STATIC OFF CACHE BOOL "static")
        add_subdirectory(${sdl2_content_SOURCE_DIR} ${sdl2_content_BINARY_DIR} EXCLUDE_FROM_ALL)
        add_library(SDL2::SDL2 ALIAS SDL2)
    elseif(WIN32 OR LINUX OR MACOS)
        set(SDL_SHARED OFF CACHE BOOL "shared")
        set(SDL_STATIC ON CACHE BOOL "static")
        set(SDL_STATIC_PIC ON CACHE BOOL "Static version of the library should be built with Position Independent Code")
        set(SDL_SHARED OFF)
        set(SDL_STATIC ON)
        set(SDL_STATIC_PIC ON)
        if(LINUX)
            set(SNDIO_SHARED ON CACHE BOOL "static")
            set(SNDIO_SHARED ON)
        endif()
        set(FORCE_STATIC_VCRT ON CACHE BOOL "static windows static vcrc")
        add_subdirectory(${sdl2_content_SOURCE_DIR} ${sdl2_content_BINARY_DIR} EXCLUDE_FROM_ALL)
        add_library(SDL2::SDL2 ALIAS SDL2-static)
    endif()
    add_library(SDL2::SDL2main ALIAS SDL2main)

    file(GLOB INCLUDE_FILES ${sdl2_content_SOURCE_DIR}/include/*.h)
    file(GLOB BIN_INCLUDE_FILES ${sdl2_content_BINARY_DIR}/include/*.h)
    foreach(_FNAME ${BIN_INCLUDE_FILES})
        get_filename_component(_INCNAME ${_FNAME} NAME)
        list(REMOVE_ITEM INCLUDE_FILES ${sdl2_content_SOURCE_DIR}/include/${_INCNAME})
    endforeach()
    list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})

    if(NOT EXISTS "${sdl2_content_BINARY_DIR}/include/SDL2")
        file(MAKE_DIRECTORY "${sdl2_content_BINARY_DIR}/include/SDL2")
        file(COPY ${INCLUDE_FILES}  DESTINATION "${sdl2_content_BINARY_DIR}/include/SDL2")
    endif()
    include_directories("${sdl2_content_BINARY_DIR}/include")

    if(EXISTS "${sdl2_content_SOURCE_DIR}/android-project")
        file(REMOVE_RECURSE "${sdl2_content_SOURCE_DIR}/android-project")
    endif()

    file(COPY CMake/Extra/sdl2-config.cmake DESTINATION ${sdl2_content_BINARY_DIR})
    set(SDL2_DIR ${sdl2_content_BINARY_DIR})
    list(APPEND SDL2_INCLUDE_DIRS "${sdl2_content_BINARY_DIR}/include/SDL2/")
    list(APPEND SDL2_INCLUDE_DIRS "${sdl2_content_BINARY_DIR}/include/")
    list(APPEND SDL2_LIBRARY_DIRS "${sdl2_content_BINARY_DIR}/")
    list(APPEND SDL2_LIBRARIES SDL2::SDL2)
    list(APPEND SDL2_LIBRARIES SDL2::SDL2main)
endif()

message("SDL2_LIBRARIES: ${SDL2_LIBRARIES}")
message("SDL2_INCLUDE_DIRS: ${SDL2_INCLUDE_DIRS}")

注意:我另外删除了Android项目文件,因为当我在Android上运行SDL2时,它们相互冲突,但这与这个问题无关。

只知道显示的代码,我们只能猜测错误:您的代码既不包含程序的创建(
add\u executable
),也不包含其链接和“Find”用于诸如
LibM
之类的包的脚本(此脚本不随CMake一起提供)。我建议获得用于链接的确切命令行(
make VERBOSE=1
),并验证该行在SDL库的任何实例之后是否具有
-lm
。我可以删除LibM代码,但它仍然会失败,并会出现同样的问题。这只是地板,所有其他数学函数都可以。如果我取而代之的是一个本地版本,在那里我修改为有自定义地板而不是math.h,它构建和工作正常,但我需要能够使用SDL2原始代码。我之前的评论并不意味着你做错了什么。我之前评论的意思是,您提供的信息不足以让我们帮助您。我现在没有电脑,所以我现在无法使用make VERBOSE进行检查-我稍后会回来。我的完整来源在这里:。目前,我正在使用已安装的sdl2进行开发。对我来说奇怪的是地板功能出错,这就是为什么我在这里问,我想看看这是否是已知的错误:/