首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将OpenCV构建为静态库将导致数以千计的未定义引用

将OpenCV构建为静态库将导致数以千计的未定义引用
EN

Stack Overflow用户
提问于 2019-07-13 19:21:35
回答 1查看 1.7K关注 0票数 0

我正在开发Ubuntu18.04,我希望构建OpenCV(4.1.0)作为静态库,并创建一个示例程序。构建OpenCV是完美无缺的,但当我运行测试应用程序时,我会遇到数千个错误。

构建OpenCV:

  • 配置cmake: OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.1.0/modules -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D BUILD_SHARED_LIBS=OFF -D -D cmake _INSTALL_前缀=/usr/local/opencv
  • 构建: 制作-j8
  • 安装: sudo make安装
  • pkg-配置设置: sudo cp unix-install/opencv4.pc /usr/lib/x86_64-linux-gnu/pkgconfig/

样本程序

代码语言:javascript
运行
复制
#include <stdio.h>
#include <opencv2/opencv.hpp>
int main( int argc, char** argv )
{
  cv::Mat testmat;
  printf("Test\n");
  return 0;
}
  • 构建: g++ TestApp.cpp -o TestApp pkg-config --cflags --libs opencv4
代码语言:javascript
运行
复制
- **I get these errors:** [Full Console.log](http://m.uploadedit.com/bbtc/1562935328413.txt)

代码语言:javascript
运行
复制
/usr/local/opencv/lib/libopencv_highgui.a(window_gtk.cpp.o): In function &#96;cvImageWidget_class_init(void*, void*)&amp;apos;: window_gtk.cpp:
.text._ZL24cvImageWidget_class_initPvS_+0xa): undefined reference to &#96;gtk_widget_get_type&amp;apos; window_gtk.cpp:
.text._ZL24cvImageWidget_class_initPvS_+0x15): undefined reference to &#96;g_type_class_peek&amp;apos; window_gtk.cpp:
.text._ZL24cvImageWidget_class_initPvS_+0x20): undefined reference to &#96;g_type_check_class_cast&amp;apos; /usr/local/opencv/lib/libopencv_highgui.a(window_gtk.cpp.o): In function &#96;icvOnTrackbar(_GtkWidget*, void*)&amp;apos;: window_gtk.cpp:
.text._ZL13icvOnTrackbarP10_GtkWidgetPv+0xd): undefined reference to &#96;gtk_range_get_type&amp;apos; window_gtk.cpp:
.text._ZL13icvOnTrackbarP10_GtkWidgetPv+0x18): undefined reference to &#96;g_type_check_instance_cast&amp;apos; window_gtk.cpp:
.text._ZL13icvOnTrackbarP10_GtkWidgetPv+0x20): undefined reference to &#96;gtk_range_get_value&amp;apos; /usr/local/opencv/lib/libopencv_highgui.a(window_gtk.cpp.o): In function &#96;std::_Sp_counted_ptr_inplace&amp;lt;CvWindow, std::allocator&amp;lt;CvWindow&amp;gt;, (__gnu_cxx::_Lock_policy)2&amp;gt;::_M_dispose()&amp;apos;: window_gtk.cpp:
.text._ZNSt23_Sp_counted_ptr_inplaceI8CvWindowSaIS0_ELN9__gnu_cxx12_Lock_policyE2EE10_M_disposeEv[_ZNSt23_Sp_counted_ptr_inplaceI8CvWindowSaIS0_ELN9__gnu_cxx12_Lock_policyE2EE10_M_disposeEv]+0x12): undefined reference to &#96;gtk_widget_destroy&amp;apos; /usr/local/opencv/lib/libopencv_highgui.a(window_gtk.cpp.o): In function &#96;icvWindowThreadLoop(void*)&amp;apos;: window_gtk.cpp:
.text._ZL19icvWindowThreadLoopPv+0x41): undefined reference to &#96;gtk_main_iteration_do&amp;apos; window_gtk.cpp:
.text._ZL19icvWindowThreadLoopPv+0x53): undefined reference to &#96;g_usleep&amp;apos; window_gtk.cpp:(.text._ZL19icvWindowThreadLoopPv+0x58): undefined reference to &#96;g_thread_yield&amp;apos; window_gtk.cpp:
.text._ZL19icvWindowThreadLoopPv+0x113): undefined reference to &#96;gtk_main_iteration_do&amp;apos; window_gtk.cpp:
.text._ZL19icvWindowThreadLoopPv+0x11d): undefined reference to &#96;g_usleep&amp;apos; window_gtk.cpp:(.text._ZL19icvWindowThreadLoopPv+0x122): undefined reference to &#96;g_thread_yield&amp;apos; /usr/local/opencv/lib/libopencv_highgui.a(window_gtk.cpp.o): In function &#96;cvImageWidget_size_request(_GtkWidget*, _GtkRequisition*)&amp;apos;: window_gtk.cpp:
(.text._ZL26cvImageWidget_size_requestP10_GtkWidgetP15_GtkRequisition+0x19): undefined reference to &#96;gtk_widget_get_type&amp;apos; window_gtk.cpp:
.text._ZL26cvImageWidget_size_requestP10_GtkWidgetP15_GtkRequisition+0x47): undefined reference to &#96;g_type_register_static_simple&amp;apos; window_gtk.cpp:
.text._ZL26cvImageWidget_size_requestP10_GtkWidgetP15_GtkRequisition+0x5b): undefined reference to &#96;g_type_check_instance_cast&amp;apos; /usr/local/opencv/lib/libopencv_highgui.a(window_gtk.cpp.o): In function &#96;cvImageWidget_set_size(_GtkWidget*, int, int)&amp;apos;: window_gtk.cpp:
.text._ZL22cvImageWidget_set_sizeP10_GtkWidgetii+0x19): undefined reference to &#96;gtk_widget_get_type&amp;apos; window_gtk.cpp:.text._ZL22cvImageWidget_set_sizeP10_GtkWidgetii+0x47): undefined reference to &#96;g_type_register_static_simple&amp;apos;

,我会感谢你的帮助。

测试修补程序:

显而易见的答案是,OpenCV无法在静态mod中生成正确的.pc文件。,但我不认为这是问题所在,为了验证我构建了OpenCV3.2.0(据我所知,.pc文件在3.2.0中正确生成),并安装了带有"sudo -dev“的超建版本。预置版起作用了,但我的自建版本也有同样的错误。我查看了这两个文件,它们几乎是一样的。

DiffCheck: 比较

opencv.pc(pre-build):

opencv.pc(self-build): 自我

build-output(opencv): 露天矿

build-output(testapp): 测试构建

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-15 08:06:41

我修好了

我的构建命令缺少了-静态标志。

代码语言:javascript
运行
复制
g++ TestApp.cpp -o TestApp `pkg-config --cflags --static --libs opencv4`

现在,它可以使用OpenCV3.2.0构建我的测试应用程序,没有任何问题,但是当我使用OpenCV4.1.0时会遇到这个错误。

代码语言:javascript
运行
复制
/usr/bin/ld: cannot find -lgflags_shared

我认为我不需要这个库,所以我通过从-lgflags_shared文件中删除opencv.pc来修正这个问题。手动工作,但使用命令行更方便。

代码语言:javascript
运行
复制
sed -i 's/-lgflags_shared //g' unix-install/opencv4.pc
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57022152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档