使用CMake获取、构建和链接SDL2失败,引用未定义'floor'
当我将我的程序与SDL2链接时,出现以下错误使用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' 我制作了一
/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进行开发。对我来说奇怪的是地板功能出错,这就是为什么我在这里问,我想看看这是否是已知的错误:/