jjzjj

c++ - 静态链接 C++ OpenCV

coder 2024-02-24 原文

我想与 OpenCV 库进行静态链接,但我遇到了一些问题。
我使用 Linux (Ubuntu)、IDE Clion、cmake 和库 OpenCV。

当我运行项目时出现错误:

[50%] Linking CXX executable OpenCVLinkingStatic /usr/bin/ld:
attempted static link of dynamic object `/usr/lib/x86_64-linux-gnu/libopencv_videostab.so.2.4.9'
collect2: error: ld returned 1 exit status
CMakeFiles/OpenCVLinkingStatic.dir/build.make:112: recipe for target 'OpenCVLinkingStatic' failed
make[3]: *** [OpenCVLinkingStatic] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/OpenCVLinkingStatic.dir/all' failed
make[2]: *** [CMakeFiles/OpenCVLinkingStatic.dir/all] Error 2
CMakeFiles/Makefile2:79: recipe for target 'CMakeFiles/OpenCVLinkingStatic.dir/rule' failed
make[1]: *** [CMakeFiles/OpenCVLinkingStatic.dir/rule] Error 2
Makefile:118: recipe for target 'OpenCVLinkingStatic' failed
make: *** [OpenCVLinkingStatic] Error 2

CMakeListst.txt:

cmake_minimum_required(VERSION 3.10)
project(OpenCVLinkingStatic)
set(CMAKE_CXX_STANDARD 11)
find_package(OpenCV REQUIRED)
set(SOURCE_FILES main.cpp)
add_executable(OpenCVLinkingStatic main.cpp)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(OpenCVLinkingStatic ${OpenCV_LIBS} "-static")

main.cpp :

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;

int main(int argc, char** argv) {

   Mat image = imread("/opt/my.jpg", CV_LOAD_IMAGE_COLOR);
   namedWindow("Display window", WINDOW_AUTOSIZE);
   imshow("Display window", image);
   waitKey(0);

   return 0;
}

我在终端中通过命令“sudo apt-get install libopencv-dev”安装了 openCV 库。

我有所有需要的带有扩展“.a”的实验室:

libopencv_core.a
libopencv_highgui.a
libopencv_video.a
libopencv_objdetect.a

它们位于“/usr/lib/x86_64-linux-gnu/”。

当我尝试执行命令时:

"gcc -static -std=c++11 main.cpp
/usr/lib/x86_64-linux-gnu/libopencv_core.a 
/usr/lib/x86_64-linux-gnu/libopencv_highgui.a 
/usr/lib/x86_64-linux-gnu/libopencv_video.a 
/usr/lib/x86_64-linux-gnu/libopencv_objdetect.a 
-lm -lpthread -lstdc++ -o MyBinary".

我得到很多行,每次都包含典型错误:

"/usr/lib/x86_64-linux-gnu/libopencv_core.a(persistence.cpp.o): In function
icvCloseFile(CvFileStorage*) :
(.text._ZL12icvCloseFileP13CvFileStorage+0x52): undefined reference to  gzclose 
/usr/lib/x86_64-linux-gnu/libopencv_core.a(persistence.cpp.o): In function  icvEof(CvFileStorage*) :
(.text._ZL6icvEofP13CvFileStorage+0x42): undefined reference to  gzeof...
/usr/lib/x86_64-linux-gnu/libopencv_highgui.a(window_gtk.cpp.o): In function
cvImageWidget_class_init(_CvImageWidgetClass*) :
(.text._ZL24cvImageWidget_class_initP19_CvImageWidgetClass+0xa): undefined reference to  gtk_widget_get_type 
/usr/lib/x86_64-linux-gnu/libopencv_highgui.a(window_gtk.cpp.o): In function  cvImageWidget_class_init(_CvImageWidgetClass*) :
(.text._ZL24cvImageWidget_class_initP19_CvImageWidgetClass+0x15): undefined reference to  gtk_type_class 
/usr/lib/x86_64-linux-gnu/libopencv_highgui.a(window_gtk.cpp.o): In function  cvImageWidget_class_init(_CvImageWidgetClass*) 
(.text._ZL24cvImageWidget_class_initP19_CvImageWidgetClass+0x20): undefined
reference to  g_type_check_class_cast 
collect2: error: ld returned 1 exit status"

早些时候,我通过源和指定参数“-DBUILD_SHARED_LIBS=OFF”构建了 openCV。
但它没有用,但是我有所有扩展名为“.a”的库。
我收到错误“indefined cv::imread”和其他类似的错误。
如果我使用动态链接,则一切正常。
你能帮我解决这个问题吗?
谢谢。

最佳答案

通常在静态链接的情况下,Open CV 核心库需要一些 3-d 方库。例如 zlib

关于c++ - 静态链接 C++ OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49914782/

有关c++ - 静态链接 C++ OpenCV的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  3. ruby-on-rails - Prawn - 表格单元格内的链接 - 2

    我正在尝试用Prawn生成PDF。在我的PDF模板中,我有带单元格的表格。在其中一个单元格中,我有一个电子邮件地址:cell_email=pdf.make_cell(:content=>booking.user_email,:border_width=>0)我想让电子邮件链接到“mailto”链接。我知道我可以这样链接:pdf.formatted_text([{:text=>booking.user_email,:link=>"mailto:#{booking.user_email}"}])但是将这两行组合起来(将格式化文本作为内容)不起作用:cell_email=pdf.make_c

  4. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  5. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  6. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  7. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  8. ruby - 使用 Watir 检查错误链接 - 2

    我有一个未排序的链接列表,我将其保存在旁边,我想单击每个链接并确保它转到真实页面而不是404、500等。问题是我不知道该怎么做。是否有一些我可以检查的对象会给我http状态代码或任何东西?mylinks=Browser.ul(:id,'my_ul_id').linksmylinks.eachdo|link|link.click#needtocheckfora200statusorsomethinghere!how?Browser.backend 最佳答案 我的回答与铁皮人的想法类似。require'net/http'require'

  9. ruby - 如何为 pbcopy 生成富文本链接 - 2

    我一直在玩一个脚本,它在Chrome中获取选定的文本并在Google中查找它,提供四个最佳选择,然后粘贴相关链接。它以不同的格式粘贴,具体取决于当前在Chrome中打开的页面-DokuWiki打开的DokuWiki格式,普通网站的HTML,我想要我的WordPress所见即所得编辑器的富文本。我尝试使用pbpaste-Preferrtf来查看没有其他样式的富文本链接在粘贴板上的样子,但它仍然输出纯文本。在文本编辑中保存文件并进行试验后,我想出了以下内容text=%q|{\rtf1{\field{\*\fldinst{HYPERLINK"URL"}}{\fldrsltTEXT}}}|te

  10. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

随机推荐