ceres在CMakeLists.txt中的大小写问题

今天跟着视觉slam十四讲写了第六章ceres部分的代码 发现编译的时候报错
先附上我的CMakeLists

cmake_minimum_required(VERSION 2.8)
project(ceres)
set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )

find_package(OpenCV REQUIRED)
find_package(Ceres REQUIRED)

include_directories( ${OpenCV_INCLUDE_DIRS} ${Ceres_INCLUDE_DIRS})
add_executable(ceres_curve ceres_curve_fitting.cpp)

target_link_libraries(ceres_curve ${OpenCV_LIBRARIES} ${Ceres_LIBRARIES})

这是报错信息

CMakeFiles/ceres_curve.dir/ceres_curve_fitting.cpp.o: In function `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*)':
/usr/include/glog/logging.h:669: undefined reference to `google::base::CheckOpMessageBuilder::CheckOpMessageBuilder(char const*)'
/usr/include/glog/logging.h:671: undefined reference to `google::base::CheckOpMessageBuilder::ForVar2()'
/usr/include/glog/logging.h:672: undefined reference to `google::base::CheckOpMessageBuilder::NewString[abi:cxx11]()'
/usr/include/glog/logging.h:669: undefined reference to `google::base::CheckOpMessageBuilder::~CheckOpMessageBuilder()'
/usr/include/glog/logging.h:669: undefined reference to `google::base::CheckOpMessageBuilder::~CheckOpMessageBuilder()'
CMakeFiles/ceres_curve.dir/ceres_curve_fitting.cpp.o: In function `main':
/home/safsafsa/projects/ceres_curve_fitting/ceres_curve_fitting.cpp:38: undefined reference to `ceres::Problem::Problem()'
/home/safsafsa/projects/ceres_curve_fitting/ceres_curve_fitting.cpp:43: undefined reference to `ceres::Problem::AddResidualBlock(ceres::CostFunction*, ceres::LossFunction*, double*)'
/home/safsafsa/projects/ceres_curve_fitting/ceres_curve_fitting.cpp:50: undefined reference to `ceres::Solver::Summary::Summary()'
/home/safsafsa/projects/ceres_curve_fitting/ceres_curve_fitting.cpp:51: undefined reference to `ceres::Solve(ceres::Solver::Options const&, ceres::Problem*, ceres::Solver::Summary*)'
/home/safsafsa/projects/ceres_curve_fitting/ceres_curve_fitting.cpp:53: undefined reference to `ceres::Solver::Summary::BriefReport[abi:cxx11]() const'
/home/safsafsa/projects/ceres_curve_fitting/ceres_curve_fitting.cpp:38: undefined reference to `ceres::Problem::~Problem()'
/home/safsafsa/projects/ceres_curve_fitting/ceres_curve_fitting.cpp:38: undefined reference to `ceres::Problem::~Problem()'
CMakeFiles/ceres_curve.dir/ceres_curve_fitting.cpp.o: In function `ceres::internal::AutoDiff<CURVE_FITTING_COST, double, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0>::Differentiate(CURVE_FITTING_COST const&, double const* const*, int, double*, double**)':
/usr/local/include/ceres/internal/autodiff.h:215: undefined reference to `google::LogMessageFatal::LogMessageFatal(char const*, int, google::CheckOpString const&)'
/usr/local/include/ceres/internal/autodiff.h:215: undefined reference to `google::LogMessage::stream()'
CMakeFiles/ceres_curve.dir/ceres_curve_fitting.cpp.o: In function `void ceres::internal::Make1stOrderPerturbation<ceres::Jet<double, 3>, double, 3>(int, double const*, ceres::Jet<double, 3>*)':
/usr/local/include/ceres/internal/autodiff.h:170: undefined reference to `google::LogMessageFatal::LogMessageFatal(char const*, int)'
/usr/local/include/ceres/internal/autodiff.h:170: undefined reference to `google::LogMessage::stream()'
CMakeFiles/ceres_curve.dir/ceres_curve_fitting.cpp.o: In function `ceres::internal::AutoDiff<CURVE_FITTING_COST, double, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0>::Differentiate(CURVE_FITTING_COST const&, double const* const*, int, double*, double**)':
/usr/local/include/ceres/internal/autodiff.h:215: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'

MD 完全看不懂 直观感觉是未定义一些ceres库里面的类 所以还是可以推断是链接库的问题 通过与网上的代码对比 终于知道问题出在哪了
CMakeLists中在include_directories和target_link_libraries时Ceres应该全部大写 但是find_package时又应该写为Ceres
(话说CMakeList中这些库的大小写对我来说一直是个迷 只能通过看官方的实例代码才能知道)
修改后的CMakeLists为:

cmake_minimum_required(VERSION 2.8)
project(ceres)
set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )

find_package(OpenCV REQUIRED)
find_package(Ceres REQUIRED)

include_directories( ${OpenCV_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS})
include_directories("/usr/include/eigen3")
add_executable(ceres_curve ceres_curve_fitting.cpp)

target_link_libraries(ceres_curve ${OpenCV_LIBRARIES} ${CERES_LIBRARIES})

编译通过

猜你喜欢

转载自blog.csdn.net/qq_27452279/article/details/89947892
今日推荐