使用 CMake 对 SDL 的未定义引用

Posted

技术标签:

【中文标题】使用 CMake 对 SDL 的未定义引用【英文标题】:Undefined reference to SDL with CMake 【发布时间】:2015-04-02 13:31:57 【问题描述】:

我正在使用 SDL (v1.2.15-7) 和 CMake (3.2.1) 开发一个项目。在 *.h 文件中,我添加了 #include <SDL.h>,当我编译它时,我遇到了一堆错误:未定义对 SDL_ 的引用...

我认为错误来自 CMakeLists.txt 但我真的不知道在哪里。

这是文件内容:

    CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )

    SET( PROJ_NAME      "Project" )
    SET( PROJ_PATH      $CMAKE_SOURCE_DIR )
    SET( PROJ_OUT_PATH  $CMAKE_BINARY_DIR )
    SET( PROJ_INCLUDES  "include" )

    FILE( GLOB_RECURSE PROJ_SOURCES src/*cpp test/*cpp doc/*)
    FILE( GLOB_RECURSE PROJ_HEADERS $PROJ_INCLUDES/$PROJ_NAME/*.h )

    PROJECT( $PROJ_NAME )

    SET(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=c++0x")

    FIND_PACKAGE( SDL REQUIRED )

    SET( PROJ_LIBRARIES $SDL_LIBS )

    INCLUDE_DIRECTORIES( $PROJ_INCLUDES $SDL_INCLUDE_DIR )
    ADD_EXECUTABLE( $PROJ_NAME $PROJ_SOURCES $PROJ_HEADERS )
    TARGET_LINK_LIBRARIES( $PROJ_NAME $PROJ_LIBRARIES )

我也试过#include SDL/SDL.h

【问题讨论】:

您不需要添加所有标题。通常它们与您的目标相关,并且会自动找到。 【参考方案1】:

错误消息来自链接器,在这种情况下,这意味着您没有链接到 SDL 库。

CMake 文档指定FindSDL 模块定义了一个名为SDL_LIBRARY 的变量,但您使用的是SDL_LIBS。所以,改为SET(PROJ_LIBRARIES $SDL_LIBRARY)

使用标准模块查找包时,请先尝试浏览文档以查看其定义的变量。名称并不总是标准的。

【讨论】:

【参考方案2】:

尝试使用SDL_LIBRARY 而不是SDL_LIBS

【讨论】:

谢谢...感觉自己好笨,下次再仔细看看 @Kruncho:使用make VERBOSE=ON 你会看到库没有通过。下次:-)【参考方案3】:

您忘记在 CMakeLists.txt 的最后一行将目标链接到 SDL_LIBRARIES

链接器产生错误,因此它与您的包含无关。

【讨论】:

不,我没有忘记,它包含在SET( PROJ_LIBRARIES $SDL_LIBS ) 中。但是我还是试过了,还是不行 他指的是你拼错了变量名。 SDL_LIBSSDL_LIBRARIES 不是同一个变量。在第一种情况下,CMake 只是将其评估为空字符串,因此您最终会链接到任何库。

以上是关于使用 CMake 对 SDL 的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

即使在链接库时,也会获得对 OpenCV 元素的未定义引用。使用 CMake

对`__glewCreateShader`的未定义引用[重复]

libVLC|make:对“libvlc_new”的未定义引用

我自己的库给了我“对 <function_name> 的未定义引用

使用 Qt 对 vtable 的未定义引用

GLEW + cmake 链接失败“未定义对符号 glDrawElements 的引用”+“命令行中缺少 DSO”