opencv - 链接依赖于 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«
解决方案
推荐阅读
- java - 打印出 ArrayList 的所有可能组合
> 递归 - angular - mat-tab 延迟加载选项卡仅一次
- kubernetes - 授予 Kubernetes 服务帐户的 Secrets 权限?
- java - java.lang.OutOfMemoryError: Java 堆空间 Files.readAllBytes(path)
- javascript - 在动态父div之后插入?
- google-cloud-platform - GCP 只读角色(查看者角色)允许从 Google Container Registry 拉取图像
- elasticsearch - 节点磁盘大小的弹性搜索问题
- java - 为什么我的 Hibernate 日志记录如此模糊?
- swift - 将用户名/电子邮件保存到 iCloud 钥匙串 ios 12
- json - 如何使用 jq 合并两个 JSON 对象?