2012-05-02 31 views
5

Tôi đã cài đặt Ubuntu vài ngày trước và sử dụng apt-get để cài đặt build_essentials, opencv, highgui, v.v. g ++ là 4.6.1, opencv có vẻ là 2.1.0 .. Tôi đã làm t xây dựng opencv từ nguồn ..Ububtu, opencv, và liên kết

Chúng tôi có một số phần mềm sử dụng chức năng opencv. Hãy giả vờ các tệp nguồn được đặt tên là a.cpp và b.cpp. Tôi biên dịch sang a.o và b.o và sau đó đặt chúng vào thư viện .so (gọi nó là libab.so).

Cuối cùng, có một tệp có tên chính trong đó (gọi là z.cpp). Tôi cố gắng để xây dựng một thực thi từ nó, nhưng tôi nhận được một tấn "không xác định tham chiếu" lỗi để cv :: công cụ. Dòng liên kết của tôi trông giống như sau:

g++ -fPIC -g z.cpp -L../lib -lab -lml -lcvaux -lhighgui -lcv -lcxcore -o z.out 

sau đó tôi nhận được lỗi tham chiếu không xác định (tất cả đều là cv :: stuff).

Phần thú vị là nếu tôi liên kết trực tiếp với các tệp .o của tôi, nó sẽ xây dựng tốt. Vì vậy, điều này:

g++ -fPIC -g z.cpp a.o b.o -lml -lcvaux -lhighgui -lcv -lcxcore -o z.out 

hoạt động.

Mọi thứ tôi đã đọc có vẻ hàm ý đây là vấn đề đặt hàng liên kết, nhưng tôi đã thử tất cả các hoán vị đặt hàng và gặp vấn đề tương tự, vì vậy tôi thực sự không nghĩ vấn đề của mình, nhưng tôi có thể vẫn sai. Bất cứ ai cũng có bất kỳ ý tưởng nào về cách tôi có thể xây dựng thư viện của mình và tại sao nó sẽ hoạt động khác nếu tôi xây dựng bộ hoàn chỉnh các tệp .o nằm trong thư viện thành công, nhưng không thể xây dựng với chính thư viện?

+0

Ok, vậy isn này 't thực sự là một "giải pháp", nhưng tôi đã kết thúc cài đặt opencv 2.3.1 từ nguồn - cũng đã phải cài đặt ffmpeg (v0.8 đặc biệt!) và bây giờ tất cả mọi thứ hoạt động. Vì vậy, nó rõ ràng đã có một cái gì đó để làm với các opencv xây dựng mà tôi đã nhận với apt-get. Tôi đã không thử điều này, nhưng tôi đoán tôi có thể đã cài đặt 2,1 từ nguồn và nó đã có thể làm việc quá. Vẫn không chắc chắn tại sao biên dịch với thư viện so với.o của sẽ là một vấn đề, nhưng mọi thứ đang làm việc bây giờ, vì vậy .... – daroo

Trả lời

3

Dường như với tôi rằng bạn đang liên kết với các thư viện C cũ hơn. Các lệnh liên kết OpenCV của ngày hôm nay sẽ giống như sau: -lopencv_core -lopencv_flann -lopencv_highgui....

Tôi thường liên kết với mô-đun lõi trước, vì thứ tự quan trọng, sau đó thực hiện theo thứ tự bảng chữ cái (để chắc chắn rằng tôi không quên mô-đun).

- EDIT -

Bạn cố gắng để đưa các -lab sau libs opencv? Điều này có thể làm các trick, kể từ khi các thư viện được liên kết theo thứ tự của dòng lệnh.

+0

Là những người cho opencv2.1.0? Tôi biết họ đã thay đổi nó, nhưng tôi có những libs từ "pkg-config opencv --libs" vì vậy tôi cho rằng chúng là những cái đúng - cũng liên kết tốt khi tôi liên kết với các tệp .o, vì vậy có vẻ như chúng có đã đúng .. Tôi sẽ kiểm tra sự tồn tại của libs được đặt tên theo cách mới .. – daroo

+0

Phiên bản sản xuất thực tế là 2.3.x và 2.4.0 là bản beta. Ubunutu có vẻ khá muộn trên các phiên bản. Dù sao, theo như tôi có thể nhớ, ngay cả khi một số mô đun mới được thêm vào theo thời gian, libopencv_core, libopencv_highui, libopencv_imgproc ... có mẫu tên này trong bản phát hành 2.x. – sansuiso

+0

Thú vị .. Tôi không có bất kỳ tệp nào có tên "libopencv *". Các tập tin trong/usr/lib được đặt tên là "libcv.so.2.1.0" "libcvaux.so.2.1.0" vv .. Tại thời điểm này, tôi có thể bị buộc phải nhận 2.3.x và xây dựng từ nguồn và se nếu nó giúp. Điều này chỉ không có vẻ như một vấn đề opencv mặc dù, cho rằng tôi có thể xây dựng tốt khi tôi liên kết với các tập tin .o từ nguồn của tôi chứ không phải .so được xây dựng từ nguồn của tôi .. – daroo

12

Bạn có thể vượt qua các cờ sau để g ++:

`pkg-config --libs opencv` 

Ví dụ:

g++ myprogram.cpp `pkg-config --libs opencv` -o myprogram 

pkg-config cung cấp cho trình biên dịch các thông tin về thư viện cho bạn.

Bạn có thể xem xét:

/usr/local/lib/pkgconfig/opencv.pc

Tập tin này có chứa tất cả các thông tin liên quan cho biên soạn:

prefix=/usr/local 
exec_prefix=${prefix} 
libdir=${exec_prefix}/lib 
includedir_old=${prefix}/include/opencv 
includedir_new=${prefix}/include 

Name: OpenCV 
Description: Open Source Computer Vision Library 
Version: 2.3.1 
Libs: -L${libdir} -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann 
Cflags: -I${includedir_old} -I${includedir_new} 
+1

Đó chính xác là những gì tôi đang làm, đó là lý do tại sao tôi không nghĩ đó là vấn đề đặt tên hoặc giải mã thư viện. Tôi đã không hiển thị nó trong bài viết của tôi cho rõ ràng, nhưng kể từ khi tôi nhận libs trực tiếp từ pkg-config, tôi đã khá chắc chắn rằng tôi đã sử dụng những cái đúng. Tôi sẽ thêm một bình luận cho câu hỏi ban đầu của tôi cho "độ phân giải" .. – daroo

Các vấn đề liên quan