Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake-链接错误和未定义的引用_C++_Cmake_Shared Libraries_Ros - Fatal编程技术网

C++ CMake-链接错误和未定义的引用

C++ CMake-链接错误和未定义的引用,c++,cmake,shared-libraries,ros,C++,Cmake,Shared Libraries,Ros,问题 我已经编写了一个ROS可执行文件,它依赖于一些第三方C代码 // ROS NODE - gist_extractor.cpp extern "C"{ #include "gist/gist.h" #include "gist/standalone_image.h" } /* Some Code */ float *gist_descriptor = color_gist_scaletab(im, nblocks, n_scale, orientations_per_scale);

问题

我已经编写了一个ROS可执行文件,它依赖于一些第三方C代码

// ROS NODE - gist_extractor.cpp 
extern "C"{
#include "gist/gist.h"
#include "gist/standalone_image.h"
}
/* Some Code */ 
float *gist_descriptor = color_gist_scaletab(im, nblocks, n_scale, orientations_per_scale); 
我的ROS可执行文件的CMake文件是

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  image_transport
  cv_bridge
  sensor_msgs
  cmake_modules
)

find_package(OpenCV REQUIRED)
find_package(FFTW REQUIRED)

###########
## Build ##
###########

## Specify additional locations of header files
include_directories( ${CMAKE_CURRENT_SOURCE_DIR} include ${catkin_INCLUDE_DIRS} 
${FFTW_INCLUDES}
)

## Add subdirectory for gist library
add_subdirectory(gist)

## Declare a C++ executable
add_executable(gist_extractor src/gist_extractor.cpp)

## Specify libraries to link a library or executable target against
target_link_libraries(gist_extractor ${catkin_LIBRARIES} gist)
函数color\u gist\u scaletab()在gist.h中声明。尽管包含了必需的.h文件,但当我执行此操作时,仍会出现以下错误

gist_extractor.cpp:+0x35e):... undefined reference to `color_gist_scaletab'
解决方案步骤

在本节中,我将介绍如何查找错误以及如何修复错误的步骤

一,。检查库是否正在生成

在我的构建库中运行MAKE之后,我们查看了正在构建的库。由于libgist.so出现,因此正在正确构建

-lboost_date_time /opt/ros/indigo/lib/libcpp_common.so -lboost_system -lboost_thread -lpthread -lconsole_bridge **/home/andy/Projects/ROS/robot_ws/devel/lib/libgist.so** 
二,。检查是否正在编译所需的函数

在本例中,我们需要color\u gist\u scaletab()。我们在unix中运行了“strings”命令。下面的命令为library.so文件中的“color\u gist\u scaletab()”运行正则表达式匹配。如果函数链接正确,那么它应该出现在.so文件中。我们意识到color\u gist\u scaletab()没有返回任何内容,这意味着函数没有被编译

strings /home/andy/Projects/ROS/robot_ws/devel/lib/libgist.so | grep color_gist_scaletab
andy@andy-MacBookPro:~/Projects/ROS/robot_ws/build$ make
Scanning dependencies of target gist
[ 20%] Building C object gist_extractor/gist/CMakeFiles/gist.dir/gist.c.o
[ 40%] Building C object gist_extractor/gist/CMakeFiles/gist.dir/standalone_image.c.o
Linking C shared library /home/andy/Projects/ROS/robot_ws/devel/lib/libgist.so
[ 40%] Built target gist
Linking CXX executable gist_extractor
[ 60%] Built target gist_extractor
[ 80%] Building CXX object simple_talker/CMakeFiles/listener.dir/src/listener.cpp.o
Linking CXX executable /home/andy/Projects/ROS/robot_ws/devel/lib/simple_talker/listener
[ 80%] Built target listener
[100%] Building CXX object simple_talker/CMakeFiles/talker.dir/src/talker.cpp.o
Linking CXX executable /home/andy/Projects/ROS/robot_ws/devel/lib/simple_talker/talker
[100%] Built target talker
三,。确定未编译函数的原因

strings /home/andy/Projects/ROS/robot_ws/devel/lib/libgist.so | grep color_gist_scaletab
andy@andy-MacBookPro:~/Projects/ROS/robot_ws/build$ make
Scanning dependencies of target gist
[ 20%] Building C object gist_extractor/gist/CMakeFiles/gist.dir/gist.c.o
[ 40%] Building C object gist_extractor/gist/CMakeFiles/gist.dir/standalone_image.c.o
Linking C shared library /home/andy/Projects/ROS/robot_ws/devel/lib/libgist.so
[ 40%] Built target gist
Linking CXX executable gist_extractor
[ 60%] Built target gist_extractor
[ 80%] Building CXX object simple_talker/CMakeFiles/listener.dir/src/listener.cpp.o
Linking CXX executable /home/andy/Projects/ROS/robot_ws/devel/lib/simple_talker/listener
[ 80%] Built target listener
[100%] Building CXX object simple_talker/CMakeFiles/talker.dir/src/talker.cpp.o
Linking CXX executable /home/andy/Projects/ROS/robot_ws/devel/lib/simple_talker/talker
[100%] Built target talker
我们做的第一件事是返回函数声明并添加一条错误语句(如下所示)

在使用这个新的CMAKE文件进行编译之后,我们成功地编译了

strings /home/andy/Projects/ROS/robot_ws/devel/lib/libgist.so | grep color_gist_scaletab
andy@andy-MacBookPro:~/Projects/ROS/robot_ws/build$ make
Scanning dependencies of target gist
[ 20%] Building C object gist_extractor/gist/CMakeFiles/gist.dir/gist.c.o
[ 40%] Building C object gist_extractor/gist/CMakeFiles/gist.dir/standalone_image.c.o
Linking C shared library /home/andy/Projects/ROS/robot_ws/devel/lib/libgist.so
[ 40%] Built target gist
Linking CXX executable gist_extractor
[ 60%] Built target gist_extractor
[ 80%] Building CXX object simple_talker/CMakeFiles/listener.dir/src/listener.cpp.o
Linking CXX executable /home/andy/Projects/ROS/robot_ws/devel/lib/simple_talker/listener
[ 80%] Built target listener
[100%] Building CXX object simple_talker/CMakeFiles/talker.dir/src/talker.cpp.o
Linking CXX executable /home/andy/Projects/ROS/robot_ws/devel/lib/simple_talker/talker
[100%] Built target talker

您需要在目标链接库行的“gist”之后添加外部库。如果您必须找到绝对路径,请使用绝对路径,该路径位于您的计算机上(或包含已编译的颜色定义的库所在的位置)。

您介意提供一个代码示例,说明如何更改我的CMake文件吗?我已经添加了库,还将库与目标库链接。但这仍然无法解决问题。谢谢因此,在CMake文件中,您只需在target_link_LIBRARIES条目中的“${catkin_LIBRARIES}”之后键入包含color_gist_scaletab()预编译定义的库的路径。因此,该行的最后一部分看起来像target_link_库(…${catkin_libraries}/usr/local/lib/library.So…)等等。如果这不起作用,那么预编译库的版本就不包含该函数的定义。下载gist库的tarball,它具有所需函数的正确版本,并为链接器重新编译一个新的库对象。谢谢。这成功了!我将在几天内发布更新的代码。经过2个月的哈希处理,今天终于可以工作了。请参阅问题中的解决方案。