2014-07-22 19 views
7

Tôi muốn xây dựng một liên kết tĩnh thực thi được liên kết tĩnh với libavcodec và libavformat. Thư viện ffmpeg tĩnh đã được xây dựng với:Tham chiếu không xác định đến avcodec_alloc_context nhưng lệnh liên kết ffmpeg chính xác?

./configure --enable-static --enable-gpl --enable-nonfree --disable-vaapi 
    --disable-libopus --prefix=myBuild --disable-swresample 

Các linkers được thiết lập như sau:

g++ -O2 -static -o myBin myBin-myBin.o someotherlibraries.a 
    -L/ffmpeg/myBuild/lib -lavformat -lavcodec -lavutil -lrt -lm -lpthread -lz 

Khi biên dịch, tôi nhận được CHỈ MỘT thông báo lỗi>: -/

src/ffmpeg/myProgram.cpp:115: error: undefined reference to 'avcodec_alloc_context' 

Đầu ra của nm /ffmpeg/myBuild/lib/libavcodec.a | grep avcodec_alloc_context:

  U avcodec_alloc_context3 
     U avcodec_alloc_context3 
000003c0 T avcodec_alloc_context3 
     U avcodec_alloc_context3 

tôi bao gồm libavcodec.h với extern "C" {} và tôi tin để mối liên kết tĩnh của tôi là đúng. Tại sao tôi nhận được lỗi này? Có phải vì phương pháp này không được chấp nhận? Làm sao tôi có thể giải quyết việc này?

SOLUTION:

Dont sử dụng

avCtx = avcodec_alloc_context() 

từ các đoạn mã có thể cũ hơn, nhưng sử dụng

codec = avcodec_find_decoder(CODEC_ID_XYZ);//for completeness but should be the same as before 
avCtx = avcodec_alloc_context3(codec) 
+1

đầu ra của 'nm /ffmpeg/myBuild/lib/libavcodec.a là gì | grep avcodec_alloc_context'? –

+0

Tôi đã thêm đầu ra vào bài đăng của mình – user2212461

+0

@PaoloBonzini có nói gì với bạn không? – user2212461

Trả lời

6

Bạn đã thử gọi avcodec_alloc_context3 để thay thế?

Tôi không gặp sự cố khi gọi avcodec_alloc_context3, phân bổ extradata rồi gọi avcodec_open2.

Cũng thứ tự liên kết nên -lavutil -lavformat -lavcodec

+0

tuyệt vời, đã hoạt động !! Tôi không biết tôi đã có đoạn mã cũ này từ đâu. Họ có xóa phiên bản không dùng nữa tại một số điểm không? – user2212461

+1

Tốt để biết nó hoạt động. Có lẽ họ đã xóa nó vì họ không thể hoán đổi cho nhau với các cuộc gọi mới hơn. –

2

nếu tôi nhớ chính xác, chúng tôi cũng đã có vấn đề với điều này và giải pháp là bạn phải thêm cụ thể libavcodec.a (cùng với đường dẫn đầy đủ) và các thư viện tĩnh khác ffmpeg vào thứ e g + + liên kết bước. Xem nếu nó hoạt động theo cách này.

Ngoài ra, thứ tự của thư viện là quan trọng. Tôi không có makefiels cũ nữa, nhưng có thể nhớ lại rằng libavutil phải là người đầu tiên trong danh sách.

Vì vậy, lệnh liên kết của bạn nên được một cái gì đó như:

g++ -O2 -static -o myBin myBin-myBin.o someotherlibraries.a 
/ffmpeg/myBuild/lib/libavutil.a 
/ffmpeg/myBuild/lib/libavformat.a 
/ffmpeg/myBuild/lib/libavcodec.a 
    -lrt -lm -lpthread -lz 
+0

liên quan đến đường dẫn thư viện tuyệt đối: không phải là cách được đề xuất của bạn và -L nội bộ chính xác như nhau? Dù sao thì cũng không có sự khác biệt. Và thứ tự mà tôi đang sử dụng có vẻ đúng trong trường hợp của tôi. Thứ tự không có nghĩa là sự phụ thuộc và chúng được đọc ngược? – user2212461

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