ubuntu20.04 pcl1.08 cmake vtk报错The `PATH` argument is required.

在Ubuntu20.04上编译PCL1.08时遇到cmake错误,问题源于vtkDetectLibraryType.cmake函数缺少PATH参数。通过检查和调试,发现FREETYPE_LIBRARY_RELEASE参数非空,但函数仍报错。为避免降低cmake版本,直接设置vdlt_PATH变量值,成功解决cmake配置问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近日在Ubuntu20.04上编译PCL 1.08,在cmake时遇到一个问题

CMake Error at /usr/local/vtk922/lib/cmake/vtk-9.2/vtkDetectLibraryType.cmake:23 (message):
  The `PATH` argument is required.
Call Stack (most recent call first):
  /usr/local/vtk922/lib/cmake/vtk-9.2/FindFreetype.cmake:179 (vtk_detect_library_type)
  /usr/local/vtk922/lib/cmake/vtk-9.2/patches/3.19/FindX11.cmake:235 (find_package)
  /usr/local/vtk922/lib/cmake/vtk-9.2/VTK-vtk-module-find-packages.cmake:350 (find_package)
  /usr/local/vtk922/lib/cmake/vtk-9.2/vtk-config.cmake:152 (include)
  CMakeLists.txt:362 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/lho/下载/pcl/build/CMakeFiles/CMakeOutput.log".
See also "/home/lho/下载/pcl/build/CMakeFiles/CMakeError.log"

在网上找了很久,也没有合适的解决方法,于是决定自己手动解决,根据报错信息,首先跳到vtkDetectLibraryType.cmake文件。

function (vtk_detect_library_type output)
  cmake_parse_arguments(PARSE_ARGV 1 vdlt
    ""
    "PATH"
    "")

  if (NOT DEFINED vdlt_PATH)
    message(FATAL_ERROR #报错的地方
      "The `PATH` argument is required.")
  endif ()

  if (DEFINED vdlt_UNPARSED_ARGUMENTS)
    message(FATAL_ERROR
      "Unparsed arguments for vtk_detect_library_type: "
      "${vdlt_UNPARSED_ARGUMENTS}")
  endif ()

调用函数的地方,FindFreetype.cmake:179 (vtk_detect_library_type)

      vtk_detect_library_type(freetype_release_library_type
        PATH "${FREETYPE_LIBRARY_RELEASE}")

然后发现这是一个cmake函数。所以决定研究一下cmake函数,下面是cmake函数的入门教程。function (vtk_detect_library_type output),vtk_detect_library_type 是 VTK 库中的一个函数,用于检测库的类型。它将 SHARED、STATIC 或 UNKNOWN 其中之一返回到作为output变量中。为什么output可以在父域被访问,因为它被设置成PARENT_SCOPE。这是一个 CMake 命令,用于将变量的值设置为指定的值。在这种情况下,它将 ${output} 变量的值设置为 ${vdlt_type} 变量的值。PARENT_SCOPE 选项表示该变量应在父作用域中设置,这意味着它可以在调用此函数的 CMake 脚本中访问。有点C++引用的感觉。

  set("${output}"
    "${vdlt_type}"
    PARENT_SCOPE)

Cmake函数入门

function(<name> [arg1 [arg2 [arg3 ...]]])
 command1(args ...)
 command2(args ...)
 ...
endfunction(<name>)

第一个name是函数的名字,后面的arg是传入的变量,所以function (vtk_detect_library_type output),函数名字是vtk_detect_library_type,output是传入参数。

  cmake_parse_arguments(PARSE_ARGV 1 vdlt
    ""
    "PATH"
    "")

这段代码使用了 cmake_parse_arguments 命令的 PARSE_ARGV 签名,用于解析函数的参数。它从函数的第一个参数(ARGV1)开始解析。

在这个例子中,vdlt 是变量前缀,用于定义一组保存相应选项值的变量。第一个 “” 表示没有选项参数,第二个 “PATH” 表示有一个单值关键字 PATH,最后一个 “” 表示没有多值关键字。

因此,在这个例子中,如果函数被调用时包含 PATH 关键字和对应的值,那么将定义一个名为 vdlt_PATH 的变量来保存该值。
例如:

      vtk_detect_library_type(freetype_release_library_type
        PATH "${FREETYPE_LIBRARY_RELEASE}")

那么在vtk_detect_library_type函数中,vdlt_PATH 值就是 ${FREETYPE_LIBRARY_RELEASE},freetype_release_library_type返回库的类型, SHARED、STATIC 或 UNKNOWN。

  The `PATH` argument is required.
  if (NOT DEFINED vdlt_PATH)
    message(FATAL_ERROR
      "The `PATH` argument is required.")
  endif ()

然后根据报错信息,可以发现是vdlt_PATH没有定义。所以首先要排查传入的参数${FREETYPE_LIBRARY_RELEASE},是不是空的。
在调用此函数的位置输入下面代码:

Message("FREETYPE_LIBRARY_RELEASE " ${FREETYPE_LIBRARY_RELEASE})

打印信息如下:

FREETYPE_LIBRARY_RELEASE /usr/lib/x86_64-linux-gnu/libfreetype.so

这就说明参数${FREETYPE_LIBRARY_RELEASE}是非空的。
然后我自己在CMakeList.txt中写了一个cmake_parse_arguments测试函数,并没有任何问题。但是原来那个cmake中却报错了。我看网上有说是因为cmake版本的问题,我的版本是cmake 3.16。但是问题是我是在同一台电脑上测试的,要是版本问题,那应该都会出错呀。如果有知道的朋友可以在下面留言。

cmake_minimum_required(VERSION 2.8)
project(test)
function(test argv1)
    set(oneValueArgs TEST1 TEST2)
    cmake_parse_arguments(PARSE_ARGV 1 test "" "${oneValueArgs}" "")
    message("argv1 " ${argv1})
    message("test_TEST1 " ${test_TEST1})  
    message("test_TEST2 " ${test_TEST2})
endfunction()

test(hello TEST1 /usr/lib/x86_64-linux-gnu/libfreetype.so)

网上有一个解决办法是把cmake版本降到3.10解决,但是我不想降,怕把系统搞崩掉。因为错误是由于vdlt_PATH未定义导致的,所以我直接人为设置vdlt_PATH变量的值,然后cmake通过。

 #[[cmake_parse_arguments(PARSE_ARGV 1 vdlt
    ""
    "PATH"
    "")]]
 
  set(vdlt_PATH /usr/lib/x86_64-linux-gnu/libfreetype.so)
    
    if (NOT DEFINED vdlt_PATH)
    message(FATAL_ERROR
      "The `PATH` argument is required.")
  endif ()

cmake_parse_arguments cmake 官网
cmake_parse_arguments csdn
Ubuntu20.04 pcl1.8编译报错[The PATH argument is required.]

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值