[英]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.