【问题标题】:CMake libraries issueCMake库问题
【发布时间】:2014-03-20 10:51:32
【问题描述】:

我正在尝试编译一个使用 URG(激光扫描仪)库和 PCL 的程序。 URG 使用 make 构建,但 PCL 使用 cmake。我一直在尝试同时使用 cmake,但我遇到了问题。

我找到了 FindURG.cmake 并把它放在了这里的 modules 文件夹中:https://github.com/wicron/vlidar/blob/master/cmake/FindURG.cmake

我的 CMakeLists 是:

cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
project(MY_GRAND_PROJECT)

find_package(PCL 1.3 REQUIRED COMPONENTS common io)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

find_package(URG REQUIRED)
include_directories(${URG_INCLUDE_DIR})
link_directories(${URG_LIBRARY})

#add_executable(pcd_write_test pcd_write.cpp)
add_executable(urg_read_test  gdScanSample.cpp)

#target_link_libraries(pcd_write_test  ${PCL_COMMON_LIBRARIES} ${PCL_IO_LIBRARIES})
target_link_libraries(urg_read_test ${URG_LIBRARY})

SET(CMAKE_C_FLAGS  "-I/usr/local/include/urg")
#SET(CMAKE_CXX_FLAGS "-I/usr/local/include/urg")

PCL 找到了,URG 也找到了,如下所示。目录看起来也不错。

root@CCSL02:/home/marwan/pcl_sample# cmake CMakeLists.txt
-- looking for PCL_COMMON
-- looking for PCL_OCTREE
-- looking for PCL_IO
-- Found c_urg libraries. /usr/local/lib/libc_urg_system.so/usr/local/lib/libc_urg.so/usr/local/lib/libc_urg_connection.so/usr/lib/liburg.so/usr/lib/liburg_connection.so/usr/lib/liburg_system.so/usr/lib/liburg_common.so/usr/lib/liburg_coordinate.so/usr/lib/liburg_geometry.so
-- Configuring done
-- Generating done
-- Build files have been written to: /home/marwan/pcl_sample

但只要我运行 make,我就会得到以下结果:

root@CCSL02:/home/marwan/pcl_sample# make
[100%] Building CXX object CMakeFiles/urg_read_test.dir/gdScanSample.cpp.o
/home/marwan/pcl_sample/gdScanSample.cpp:10:21: fatal error: UrgCtrl.h: No such file or directory compilation terminated.
make[2]: *** [CMakeFiles/urg_read_test.dir/gdScanSample.cpp.o] Error 1
make[1]: *** [CMakeFiles/urg_read_test.dir/all] Error 2
make: *** [all] Error 2

我尝试使用 CMakeLists,我尝试在其中添加 CXX 标志但没有运气

需要注意的是,下面的makefile可以正常编译urg程序

# Makefile for urg_sample
# Satofumi KAMIMURA
# $Id: Makefile 1997 2012-10-30 02:57:51Z satofumi $

CXXFLAGS = -g -O0 -Wall -Werror `urg-config --cflags` `sdl-config --cflags`
LDFLAGS =
LDLIBS = `urg-config --libs` `sdl-config --libs` -lc

TARGET = gdScanSample

all : $(TARGET)

clean :
    $(RM) *.o $(TARGET)

.PHONY : all clean

【问题讨论】:

  • 不要使用CMAKE_<LANG>_FLAGS 指定包含目录(这是include_directoriestarget_include_directories 的用途)。事实上,不要将它用于任何东西,现代 CMake 几乎总是有更好的替代方案可用。尝试在脚本中添加一些message 命令,以验证 find 脚本获取的变量是否包含您期望的值。
  • @ComicSansMS 好电话,URG_INCLUDE_DIR 只是 /usr/local/include。在末尾添加 /urg 修复了错误。 include_directories(${URG_INCLUDE_DIR}/urg) 但是,我得到了一个新的 /usr/bin/ld: cannot find -lURG collect2: ld returned 1 exit status 注意:URG_LIBRARY 是 /usr/local/lib/libc_urg.so
  • @ComicSansMS 忽略我最后的评论,我实际上得到了所有这些未定义的函数引用:gdScanSample.cpp:(.text+0x49): undefined reference to qrk::UrgCtrl::UrgCtrl()' gdScanSample.cpp:(.text+0x61): undefined reference to qrk::UrgCtrl::连接(char const*, long)' ...
  • 你能检查在原始 Makefile 中使用的urg-config --libs 调用的输出吗?将其与 find 脚本获取的${URG_LIBRARY} 进行比较。
  • @ComicSansMS urg-config --libs 返回 -lurg_monitor -lurg -lurg_coordinate -lurg_geometry -lurg_connection -lurg_connection_sdl -lurg_common -lurg_system -lm 而 ${URG_LIBRARY} 是路径:/usr/local/lib /libc_urg.so

标签: c++ compiler-construction makefile cmake libraries


【解决方案1】:

您需要验证SET(CMAKE_C_FLAGS "-I/usr/local/include/urg") 指向所有h 文件所在的目录。也许您需要添加多个位置。

【讨论】:

  • 我通过运行 urg-config --cflags 获得了目录 我也尝试过 SET(CMAKE_CXX_FLAGS "-I/usr/local/include/urg -I/usr/include/SDL -D_GNU_SOURCE= 1 -D_REENTRANT") 是 urg-congig 和 sdl-config --cflags 的输出。如果我将 CMAKE_C_FLAGS 更改为 CMAKE_CXX_FLAGS 我会得到未定义的函数引用。
  • PCL_INCLUDE_DIRS 来自哪里?我认为这应该包括 h 文件所在的实际目录。PCL_LIBRARY_DIRS 和外部库也是如此。
  • 它来自 FindPCL.cmake。 完全没有问题 pcl。它是未编译的 URG 库。
【解决方案2】:

感谢 ComicSansMS 解决

这是一个有效的 CMakeLists.txt:

cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
project(MY_GRAND_PROJECT)

find_package(PCL 1.3 REQUIRED)#COMPONENTS common io)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

find_package(URG REQUIRED)
include_directories(${URG_INCLUDE_DIR}/urg)
link_directories(${URG_LIBRARIES}) 

add_executable(pcd_write_test pcd_write.cpp)

target_link_libraries(pcd_write_test  ${PCL_LIBRARIES}  ${URG_LIBRARIES})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2020-04-30
    相关资源
    最近更新 更多