【问题标题】:cmake: leading or trailing whitespace (policy CMP0004)cmake:前导或尾随空格(策略 CMP0004)
【发布时间】:2018-01-25 13:45:08
【问题描述】:

我关注this question。但是我的cmake 面临错误:

-- Configuring done
CMake Error at CMakeLists.txt:18 (add_executable):
  Target "main" links to item "-L/usr/lib/x86_64-linux-gnu -lSDL2 " which has
  leading or trailing whitespace.  This is now an error according to policy
  CMP0004.


-- Generating done

cmake 列表有什么问题?

我认为细微的cmake 版本差异不会导致这样的错误。

# CMakeLists.txt

cmake_minimum_required(VERSION 3.5.1)
project (main)

add_executable(main
    main.cpp
)

find_package(SDL2 REQUIRED)
include_directories(${SDL2_INCLUDE_DIRS})
target_link_libraries(main ${SDL2_LIBRARIES})

.

// main.cpp

int main()
{
    return 0;
}

更新:

内容 /usr/lib/x86_64-linux-gnu/cmake/SDL2/sdl2-config.cmake

# sdl2 cmake project-config input for ./configure scripts

set(prefix "/usr") 
set(exec_prefix "${prefix}")
set(libdir "${prefix}/lib/x86_64-linux-gnu")
set(SDL2_PREFIX "/usr")
set(SDL2_EXEC_PREFIX "/usr")
set(SDL2_LIBDIR "${prefix}/lib/x86_64-linux-gnu")
set(SDL2_INCLUDE_DIRS "${prefix}/include/SDL2")
set(SDL2_LIBRARIES "-L${SDL2_LIBDIR}  -lSDL2 ")

【问题讨论】:

  • 这看起来像是 SDL2 提供的包配置文件中的一个问题(但我不使用 SDL2,所以无法发表更多评论)。
  • SDL2 安装中应该有 sdl2-config.cmake 文件(它可能是 libsdl2-dev 包的一部分左右)。向我们展示此文件的内容。如果它看起来像这样:github.com/xerpi/SDL-Vita/blob/master/sdl2-config.cmake.inSD2_LIBRARIES 变量的内容用双引号括起来),那么错误是可以理解的。快速修复可能是删除这些双引号。
  • @Tsyvarev,已更新。
  • @Tsyvarev,这很有趣。我将最后一行转换为set(SDL2_LIBRARIES "-L${SDL2_LIBDIR} -lSDL2"),现在一切都很好。非常感谢。我只是想知道,为什么会出现这个问题。这是CMakeSDL2 中的错误吗?
  • SDL2 配置文件肯定有问题。

标签: c++ cmake sdl-2


【解决方案1】:

ar2015's answer是对的,但sdl2-config.cmake不需要修改。

只需去掉target_link_libraries之前的尾随空格:

string(STRIP ${SDL2_LIBRARIES} SDL2_LIBRARIES)

target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARIES})

【讨论】:

  • 我从不喜欢猴子补丁。这是最好的答案,但引出了一个问题,为什么这个错误仍然存​​在?
【解决方案2】:

解决办法是编辑sdl2-config.cmake文件。

你可以通过命令找到这个文件:

apt-file search sdl2-config

在 Ubuntu Ubuntu 16.04 它位于

 /usr/lib/x86_64-linux-gnu/cmake/SDL2/sdl2-config.cmake

在源文件中,

# sdl2 cmake project-config input for ./configure scripts

set(prefix "/usr") 
set(exec_prefix "${prefix}")
set(libdir "${prefix}/lib/x86_64-linux-gnu")
set(SDL2_PREFIX "/usr")
set(SDL2_EXEC_PREFIX "/usr")
set(SDL2_LIBDIR "${prefix}/lib/x86_64-linux-gnu")
set(SDL2_INCLUDE_DIRS "${prefix}/include/SDL2")
set(SDL2_LIBRARIES "-L${SDL2_LIBDIR}  -lSDL2 ")   <---- here

在最后一行,有一个多余的空格应该删除

BEFORE:    set(SDL2_LIBRARIES "-L${SDL2_LIBDIR}  -lSDL2 ")
AFTER :    set(SDL2_LIBRARIES "-L${SDL2_LIBDIR}  -lSDL2")

那么,问题就帮我解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-16
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多