C++ 使用cmake链接到自定义库

C++ 使用cmake链接到自定义库,c++,linker,cmake,C++,Linker,Cmake,我有两个cmake文件,它们构建了一个目录,然后尝试编译一个使用该库的示例。存储在项目根目录${CMAKE_SOURCE_DIR}中的第一个CMakeLists.txt文件的内容是: cmake_minimum_required(VERSION 2.8 FATAL_ERROR) project("lsd_point_pair") SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) SET(LIBRARY_OUTPUT_PATH ${P

我有两个cmake文件,它们构建了一个目录,然后尝试编译一个使用该库的示例。存储在项目根目录
${CMAKE_SOURCE_DIR}
中的第一个CMakeLists.txt文件的内容是:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project("lsd_point_pair")

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH  ${PROJECT_BINARY_DIR}/lib)

#Note: Eclipse automatically picks up include paths with this on!
SET(CMAKE_VERBOSE_MAKEFILE ON)


SET(CMAKE_CXX_FLAGS "-g")


find_package(PCL 1.7 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

set(BOOST_LIBS program_options)
find_package(Boost COMPONENTS ${BOOST_LIBS} REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
MESSAGE("  Boost_LIBRARIES: ${Boost_LIBRARIES}")

include_directories(${PROJECT_BINARY_DIR})
link_directories(${PROJECT_BINARY_DIR}/lib})  


add_library(lsd_obj_rec_ransac lsd_obj_rec_ransac.cpp lsd_obj_rec_ransac.h lsd_point_pair_model_library.cpp lsd_point_pair_model_library.h ndim_voxel_structure.h orr_octree_cloud.h orr_octree_cloud.cpp)
target_link_libraries(lsd_obj_rec_ransac ${PCL_LIBRARIES} ${Boost_LIBRARIES})   

######## subdirectories #########
add_subdirectory(examples)
${CMAKE\u SOURCE\u DIR}
/示例中,我有以下CMakeLists.txt文件:

add_executable(example_pcl_lsd_point_pair example_pcl_lsd_point_pair.cpp)
target_link_libraries(example_pcl_lsd_point_pair lsd_obj_rec_ransac ${Boost_LIBRARIES} ${PCL_LIBRARIES})
成功运行cmake后,我运行make并获得链接错误:

CMakeFiles/example_pcl_lsd_point_pair.dir/example_pcl_lsd_point_pair.cpp.o: In function `~LSDObjRecRANSAC':
make[2]: Leaving directory `/media/Data/Documents/Grad/research/Projects/LSDPointPairs/qtcreator-build'
make[1]: Leaving directory `/media/Data/Documents/Grad/research/Projects/LSDPointPairs/qtcreator-build'
/home/mustafa/projects/LSDPointPairs/examples/../lsd_obj_rec_ransac.h:44: undefined reference to `pcl::recognition::ORROctreeCloud::~ORROctreeCloud()'
/home/mustafa/projects/LSDPointPairs/examples/../lsd_obj_rec_ransac.h:44: undefined reference to `pcl::recognition::ORROctreeCloud::~ORROctreeCloud()'
../lib/liblsd_obj_rec_ransac.a(lsd_obj_rec_ransac.cpp.o): In function `LSDObjRecRANSAC':
/home/mustafa/projects/LSDPointPairs/lsd_obj_rec_ransac.cpp:18: undefined reference to `pcl::recognition::LSDPointPairModelLibrary::LSDPointPairModelLibrary(float, float, float)'
/home/mustafa/projects/LSDPointPairs/lsd_obj_rec_ransac.cpp:18: undefined reference to `pcl::recognition::ORROctreeCloud::ORROctreeCloud()'
/home/mustafa/projects/LSDPointPairs/lsd_obj_rec_ransac.cpp:18: undefined reference to `pcl::recognition::ORROctreeCloud::~ORROctreeCloud()'
../lib/liblsd_obj_rec_ransac.a(lsd_point_pair_model_library.cpp.o): In function `LSDPointPairModel':
/home/mustafa/projects/LSDPointPairs/lsd_point_pair_model_library.h:36: undefined reference to `pcl::recognition::ORROctreeCloud::ORROctreeCloud()'
/home/mustafa/projects/LSDPointPairs/lsd_point_pair_model_library.h:36: undefined reference to `pcl::recognition::ORROctreeCloud::~ORROctreeCloud()'
../lib/liblsd_obj_rec_ransac.a(lsd_point_pair_model_library.cpp.o): In function `~LSDPointPairModel':
/home/mustafa/projects/LSDPointPairs/lsd_point_pair_model_library.h:27: undefined reference to `pcl::recognition::ORROctreeCloud::~ORROctreeCloud()'
/home/mustafa/projects/LSDPointPairs/lsd_point_pair_model_library.h:27: undefined reference to `pcl::recognition::ORROctreeCloud::~ORROctreeCloud()'
collect2: ld returned 1 exit status
make[2]: *** [bin/example_pcl_lsd_point_pair] Error 1
make[1]: *** [examples/CMakeFiles/example_pcl_lsd_point_pair.dir/all] Error 2
make: *** [all] Error 2

由于我看到liblsd_obj_rec_ransac,库已成功构建。但问题发生在编译示例时。我做错了什么?

您是否尝试键入
make VERBOSE=1
以检查所有必需库的路径是否正确?或者,在
目标链接库(…)之前插入
消息(${PCL\u libraries})
。很可能您只是在这里传递一个空字符串,而不是实际的库名。实际上链接到PCL是可以的。错误中提到的所有头文件都来自我的自定义构建库。自定义库的头文件也位于名称空间PCL下。我这样做是因为我希望将来将这些文件提供给PCL库。此外,自定义库中的文件之间也会发生链接错误。令人困惑的是,当我只是自己构建库时,它会成功构建,但当我尝试编译使用该库的示例文件时,库中会出现链接错误。当我最初自己编译库时,不应该出现这些链接错误吗?问题解决了。这是因为自定义库中的OrrOctreeCloud类有一个声明的默认构造函数/析构函数,而该构造函数/析构函数从未在.cpp文件中定义过。这会阻止构造函数为该类生成默认构造函数和析构函数。