2017-07-17 102 views
0

我試圖運行LibSourcey來使用Webrtc Streaming Server。Libsourcey缺失-fPIC編譯錯誤

事情是,我似乎無法使它的工作。 我努力在我的Ubuntu 16.04上製作項目(在cmake文件中使用正則表達式),但現在修復了它。 我居然得了的問題是在編譯時將共享對象錯誤:

usr/bin/ld: /home/kimmie/ffmpeg_build/lib/libswresample.a(options.o): 
relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; 
recompile with -fPIC 

/home/kimmie/ffmpeg_build/lib/libswresample.a: error adding symbols: Bad value 
collect2: error: ld returned 1 exit status 

av/CMakeFiles/av.dir/build.make:783: recipe for target 'av/libscy_av.so.1.0.2' failed 

任何幫助將是非常讚賞,因爲我不知道現在該做什麼。

回答

2

我在Ubuntu 16.04上遇到同樣的錯誤。

我結束了用標誌重新編譯FFmpeg來構建共享庫。下面的代碼示例框在FFmpeg Compilation Guide,添加以下兩個標誌到的./configure線在適用:

  • --enable-PIC

  • --enable共享

我刪除了--disable-shared標誌。

我向每個組件添加了--enable-pic--enable-shared,並且如果它返回了該組件無法識別的消息,則將其移除。至少libx264,libfdk-acc和libmp3lame需要--enable-shared。然後進行最後的FFmpeg(複製和FFmpeg的導上方掛貼):

PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \ 
--prefix="$HOME/ffmpeg_build" \ 
--pkg-config-flags="--static" \ 
--extra-cflags="-I$HOME/ffmpeg_build/include" \ 
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \ 
--bindir="$HOME/bin" \ 
--enable-gpl \ 
--enable-libass \ 
--enable-libfdk-aac \ 
--enable-libfreetype \ 
--enable-libmp3lame \ 
--enable-libopus \ 
--enable-libtheora \ 
--enable-libvorbis \ 
--enable-libvpx \ 
--enable-libx264 \ 
--enable-libx265 \ 
--enable-nonfree \ 
--enable-pic \ 
--enable-shared 

注意最後兩行我的例子比FFmpeg的 導向不同。

完成所有這些之後,最好刪除Libsourcey源代碼和構建文件夾,然後重新開始。

我花了大約4-5天的時間,最終編譯並使用FFmpeg和WebRTC依賴關係成功構建了Libsourcey。我也遇到了一些其他問題,所以如果你有其他問題,請務必給我貼上標籤。注意:我很喜歡Linux的構建,並且對所有的概念都不太確定。這只是對我有用,也許它會爲你工作。

0

您有鏈接錯誤,而不是編譯錯誤。你還沒碰到一個bug, 你剛剛嘗試了一個無法工作的鏈接。您正試圖建立共享庫libscy_av.so。在共享庫中鏈接的所有對象 必須包含Position Independent Code。要使用gcc生成 這樣的目標文件,可以使用選項-fPIC進行編譯。

鏈接器發現您的共享庫文件需要目標文件 options.o,它是靜態庫libswresample.a的成員。然後 發現這個options.o不是PIC,所以不能鏈接到 共享庫。鏈接失敗,鏈接程序建議您必須使用-fPIC編譯器選項重新編譯 options.o

要遵守該建議,您必須從源重建靜態庫libswresample.a,並將-fPIC添加到編譯器標誌。

您可能會這樣做,但靜態庫中的目標文件以 爲PIC並不常見,並且有一個更簡單的選項。您的錯誤是與 靜態版本libswresamplelibswresample.a)鏈接,而不是 共享版本(libswresample.so),這將是PIC。糾正那個錯誤。如果您從軟件包管理器提供的開發包安裝了 libswresample.a,那麼它還將提供libswresample.so。如果您已經從源代碼構建了libswresample ,那麼構建系統也將構建兩者。