cmake:前导或尾随空格(策略 CMP0004)
Posted
技术标签:
【中文标题】cmake:前导或尾随空格(策略 CMP0004)【英文标题】:cmake: leading or trailing whitespace (policy 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.in(SD2_LIBRARIES 变量的内容用双引号括起来),那么错误是可以理解的。快速修复可能是删除这些双引号。
@Tsyvarev,已更新。
@Tsyvarev,这很有趣。我将最后一行转换为set(SDL2_LIBRARIES "-L$SDL2_LIBDIR -lSDL2")
,现在一切都很好。非常感谢。我只是想知道,为什么会出现这个问题。这是CMake
或SDL2
中的错误吗?
SDL2 配置文件肯定有问题。
【参考方案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")
那么,问题就帮我解决了。
【讨论】:
以上是关于cmake:前导或尾随空格(策略 CMP0004)的主要内容,如果未能解决你的问题,请参考以下文章