簡體   English   中英

將C ++代碼構建到共享庫中

[英]building c++ code into a shared library

我有一些C ++代碼,我在Java應用程序中用作共享庫。我的C ++代碼使用了ffmpeg和boost等庫。 和ffmpeg庫又取決於libx264。 我的第一個問題是-我可以將c ++內置到一個“胖”共享庫中,該庫包含所有使用的庫中的所有符號,以便在新機器上復制我的胖.so文件,一切正常。 如果那不可能,那么您可以幫助我修復當前的構建過程。 這是我目前正在做的-

1)在本地VM(ubuntu 64)上,我使用-fPIC標志編譯ffmpeg代碼,並使用apt-get命令安裝h264和boost。
2)在同一台VM上,我使用make文件編譯我的代碼,如下所示:

INCLUDES =   -I/opt/ffmpeg/include -I/usr/lib/jvm/java-7-openjdk-   amd64/include -I/usr/lib/jvm/java-7-openjdk-amd64/include/linux

LDFLAGS =   -L/home/ubuntu/ffmpeg_shared

LIBRARIES = -lavformat -lavcodec -lswscale -lavutil -lpthread  -lx264 -lboost_system -lboost_thread -lboost_chrono 

CC = g++ -std=c++11 -fPIC

all:clean final

final:Api.o ImageSequence.o OverlayAnimation.o Utils.o ImageFrame.o 
$(CC)  -o final.so Api.o ImageSequence.o OverlayAnimation.o Utils.o  ImageFrame.o $(LDFLAGS) $(LIBRARIES) -shared 

3)在將運行Java應用程序的新計算機上。 我安裝h264並使用apt-get命令增強功能,並將ffmpeg的編譯庫文件復制到/ usr / local / lib。

4)將final.so文件復制到此新計算機上。 但是,當Java代碼嘗試使用final.so文件時,我看到它嘗試使用命名異常的文件。 例如-它試圖找到libavcodec.so.57,libavformat.so.57等來解決此問題,我只是創建了這些文件的副本,即libavcodec.so復制到了libavcodec.so.57。

5)但是這些ffmpeg庫反過來使用了另一個命名為lib264.so的文件。 在我的新機器上,x264的apt-get命令安裝了一個名為libx264.so.148的文件,但是ffmpeg庫之一正在搜索文件libx264.so.142,即使我重命名了libx264.so文件,在ffmpeg庫中也遇到了新錯誤嘗試調用帶有這些數字的libx264的方法。

6)目前,對我而言,唯一可行的選擇是在每台新計算機上都使用c ++代碼,並在本地構建final.so文件。 這是我要避免的事情,因為我想將.so文件和jar文件一起分發給我的客戶端,他們可以輕松使用它們而無需構建和安裝東西。

我可能有一個針對“胖”庫的解決方案,但我不確定100%是否會起作用。

通常,可以通過指定這些鏈接器標志將靜態庫鏈接到共享庫中。

g++ -Wl,--whole-archive some_static_lib.a -Wl,--no-whole-archive

因此,您將必須將所有庫編譯為靜態庫。 如果您認為值得這樣做,可以嘗試一下。

第二部分:您的另一台計算機似乎正在使用不同版本的庫。 在示例中,libx264.so.148可能是1.4.8版本或類似的版本。 因此,您的libx264.so應該是指向libx264.so.148的符號鏈接。 您可以使用

ln -l 

可視化您的符號鏈接所指向的位置。

我建議在兩台計算機上手動編譯所有需要的庫。 然后應該解決這些問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM