首页 > 解决方案 > 链接依赖于 OpenCV 和 Ceres-Solver 的静态库时,Opencv imread 会导致 liblapack 中的链接器错误

问题描述

我正在尝试使用 CMake建立我自己的库的编译,该库依赖于 OpenCV 和 Ceres-Solver ( http://ceres-solver.org/ )。但是,这样做时,将我的库链接到某些可执行文件时会出现链接器错误,尤其是我认为 OpenCV 的 imread 函数是罪魁祸首,但问题也可能与 Ceres 有关。

我正在使用 Ceres 1.14.0 版和 OpenCV 3.2.0 版。

我已经发现如果我主要声明一个 ceres::Solver::Summary 问题就不会存在。我只是不明白为什么需要这样做?

我已经把我的问题归结为我能想到的最小的例子:

CMakeLists.txt

find_package(OpenCV REQUIRED)
find_package(Ceres REQUIRED)
add_library(MyLib empty.cc empty.h)
target_include_directories(MyLib PUBLIC ${OpenCV_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS})
target_link_libraries(MyLib PRIVATE ${OpenCV_LIBS} ${CERES_LIBRARIES})
# I also tried PUBLIC
add_executable(Main main.cc)
target_link_libraries(Main MyLib)

主文件

#include "ceres/ceres.h"
#include <opencv2/opencv.hpp>
int main() {
  cv::imread("a", 0);
  //ceres::Solver::Summary do_nothing_but_fix_linking;
}

我希望它可以毫无问题地编译,但是如果我将 do_nothing_but_fix_linking 注释掉,我会收到以下错误:

制作

/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_dgemoveT«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_zgemoveT«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_strscal«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_sscal«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_ssqtrans«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_zsqtrans«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_sgeset«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_sgemoveT«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_cGetNB«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_ctrscal«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_zgemaxnrm«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_cgemaxnrm«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_dscal«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_cgezero«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_dgezero«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_dgemaxnrm«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_csqtrans«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_ccplxdivide«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_ccplxinvert«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_dger«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_zcplxinvert«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_cgeru«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_zGetNB«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_sgescal«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_dtrscal«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_zgeset«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_sger«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_sgezero«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_sgemaxnrm«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_sGetNB«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_zgeru«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_cgemoveT«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_zcplxdivide«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_xerbla«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_dGetNB«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_zgezero«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_cgeset«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_dgeset«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_zscal«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_dgescal«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_cscal«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_ztrscal«
/usr/lib/x86_64-linux-gnu/liblapack.so: Warnung: undefinierter Verweis auf »ATL_dsqtrans«

标签: opencvcmakelinker-errorsimreadceres-solver

解决方案


推荐阅读