Làm cách nào để biên dịch FFmpeg với libfdkaac thành một nhị phân tĩnh duy nhất? [đóng cửa]


9

Mục tiêu của tôi là xây dựng một nhị phân FFmpeg tĩnh duy nhất với libfdkaac và x264 hỗ trợ cho OSX và Linux. Đầu tiên, tôi đã cố gắng xây dựng một cái trên OSX, tôi làm theo hướng dẫn trên web FFmpeg: https://trac.ffmpeg.org/wiki/CompilationGuide/MacOSX

Đây là cài đặt cấu hình tôi đã áp dụng để xây dựng nhị phân tĩnh:

./configure pkg_config='pkg-config --static' --prefix=/usr/local --extra-version=ntd_20150126 --disable-shared --enable-static --enable-gpl --enable-pthreads --enable-nonfree --enable-fontconfig --enable-libfreetype --enable-libass --enable-libfdk-aac  --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-filters --enable-runtime-cpudetect

Sau quá trình xây dựng, FFmpeg khoảng 14Mb, ​​có nghĩa là nó không bao gồm các thư viện của bên thứ ba. Trong thực tế, nó đòi hỏi phải liên kết đến các thư viện động nằm ở /usr/local/lib. Nếu tôi loại bỏ các lib động đó, FFmpeg sẽ hiển thị một lỗi như:

dyld: Library not loaded: /usr/local/lib/libSDL-1.2.0.dylib
Referenced from: /usr/local/bin/ffmpeg
Reason: image not found
Trace/BPT trap: 5

Đây có phải là cách đúng đắn để biến tất cả các thư viện bên ngoài thành nhị phân tĩnh đơn?

Tôi sẽ thực sự đánh giá cao sự giúp đỡ của bạn!


1
Cuối cùng tôi đã tìm nó ra. Lý do các thư viện động vẫn được liên kết là do quá trình xây dựng ffmepg được ưu tiên cao hơn để sử dụng thư viện động. Trên thực tế tôi đã xây dựng cả thư viện động và thư viện tĩnh trong thư mục tiền tố và khi tôi xóa tất cả các tệp * .dylib khỏi thư mục tiền tố, quá trình xây dựng đã lấy thư viện tĩnh và xây dựng nhị phân đơn thành công.
Ellis Shen

Cân nhắc trả lời câu hỏi của riêng bạn cho những người khác đang gặp vấn đề tương tự.
stib

OS X không có lddlệnh, để hiển thị các phụ thuộc thư viện động của tệp nhị phân? Hay chỉ là một filelệnh với đầu ra bao gồm liệu một nhị phân được liên kết tĩnh hay động?
Peter Cordes

Ngoài ra, có --disable-shared --enable-staticnên tạo một nhị phân tĩnh. Tôi nghĩ rằng nó làm trên Linux, hoặc khi biên dịch chéo cho các cửa sổ. Vì vậy, nó có vẻ như là một lỗi trong tập lệnh xây dựng ffmpeg trên OS X
Peter Cordes

Rất tiếc, chỉ cập nhật FFmpeg của riêng tôi (trên GNU / Linux) và --enable-statickhông tạo các nhị phân tĩnh. Nó làm cho các libav*thư viện được xây dựng bởi ffmpeg (và được sử dụng bởi các nhị phân) tĩnh hay không. Nó không làm cho ffmpeg sử dụng các phiên bản tĩnh của các thư viện bên ngoài. Vì vậy, những gì bạn đang thấy là hành vi tiêu chuẩn cho ffmpeg.
Peter Cordes

Câu trả lời:


4

Trong CentOS 5.11 và FFmpeg 3.0 của tôi, tôi phải sử dụng các tùy chọn

--pkg-config-flags="--static"
--extra-cflags="-I$HOME/ffmpeg/include -static"
--extra-ldflags="-L$HOME/ffmpeg/lib -static"

--enable-static nói với trình biên dịch để tạo "thư viện tĩnh" (libav * .a). Chúng ta có thể kết hợp API FFmpeg trong ứng dụng độc lập (tĩnh) khác.

--disable-shared nói với một trình biên dịch không tạo ra "thư viện đối tượng chia sẻ được liên kết động" (libav * .so). Các loại thư viện này có thể được tải và sử dụng API FFmpeg bởi ứng dụng khác.

Hai tùy chọn này không tuân thủ FFmpeg dưới dạng thực thi tĩnh độc lập.


9

Cảm ơn lời đề nghị của stib. Tôi để lại câu trả lời của tôi ở đây.

Quá trình xây dựng FFmepg được ưu tiên cao hơn để sử dụng thư viện động ngay cả khi các thư viện tĩnh đã sẵn sàng. Do đó, trước tiên tôi đã xóa một số thư viện bên ngoài hỗ trợ khỏi cấu hình xây dựng và đảm bảo tất cả các thư viện bên ngoài chỉ ở trạng thái tĩnh (xóa * .dylib khỏi tiền tố / usr / local / lib). Sau đó xây dựng lại nó bằng lệnh sau:

./configure --pkg-config-flags="--static" --libdir=/usr/local/lib --extra-version=ntd_20150128 --disable-shared --enable-static --enable-gpl --enable-pthreads --enable-nonfree  --enable-libass --enable-libfdk-aac  --enable-libmp3lame  --enable-libx264 --enable-filters --enable-runtime-cpudetect

Nhớ xác định --pkg-config-flags="--static", yêu cầu quá trình xây dựng để sử dụng thư viện tĩnh. Sau đó, chúng ta sẽ nhận được một nhị phân FFmpeg thực thi duy nhất!

PS: Tôi đã xóa hỗ trợ libass khỏi cấu hình, vì libass phụ thuộc vào lib lib Fontconfig mà tôi chỉ có sẵn thư viện động. Tôi sẽ đặt lại hỗ trợ libass sau khi tôi tìm ra cách tạo một thư viện tĩnh của fontconfig.

Cảm ơn.


Vì vậy, "--enable-static" là không cần thiết?!
Dr.jacky

3
Tôi nghĩ - vẫn có thể tồn tại tĩnh
Ellis Shen

1
Ôi, bạn đã cứu mạng tôi, tôi đã làm việc về vấn đề này được gần 2 tuần, thu thập dữ liệu trên web để tìm giải pháp. Và đây là nó. Cảm ơn bạn !
YoannM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.