CMake:前导或尾随空格(策略CMP0004)

20

我正在跟随这个问题。然而我的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 ")

2
这似乎是SDL2提供的软件包配置文件中的问题(但我不使用SDL2,所以无法发表更多评论)。 - Angew is no longer proud of SO
1
你的SDL2安装包中应该包含sdl2-config.cmake文件(可能是libsdl2-dev包的一部分等)。展示此文件的内容。如果其内容看起来像 https://github.com/xerpi/SDL-Vita/blob/master/sdl2-config.cmake.in(*SD2_LIBRARIES*变量的内容被封装在双引号中),那么这个错误就可以理解了。快速修复可以是删除这些双引号。 - Tsyvarev
@Tsyvarev,已更新。 - ar2015
@Tsyvarev,很有趣。我将最后一行转换为set(SDL2_LIBRARIES "-L${SDL2_LIBDIR} -lSDL2"),现在一切都好了。非常感谢你。我只是想知道,为什么会出现这个问题。这是CMakeSDL2的一个错误吗? - ar2015
这绝对是与SDL2配置文件有关的问题。 - Tsyvarev
你应该将那个作为答案添加进去,非常感谢我能够这么快找到它。我还不得不通过谷歌查找位置:/usr/lib/x86_64-linux-gnu/cmake/SDL2/sdl2-config.cmake。仅仅删除最后一个空格就解决了我的问题。 - OrderAndChaos
2个回答

12

ar2015的回答是正确的,但修改sdl2-config.cmake是不必要的。

只需在target_link_libraries之前删除尾随空格:

string(STRIP ${SDL2_LIBRARIES} SDL2_LIBRARIES)

target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARIES})

我从来不喜欢猴子补丁。这是最好的答案,但问题是,为什么这个 bug 仍然存在? - activedecay

7
解决方案是编辑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")

然后,问题就被我解决了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接