【发布时间】: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_directories和target_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 toqrk::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