【发布时间】:2016-08-01 08:13:21
【问题描述】:
我有一些 c++ 代码用作 Java 应用程序中的共享库。我的 c++ 代码使用一些库,如 ffmpeg 和 boost。而 ffmpeg 库又依赖于 libx264。我的第一个问题是 - 我可以将我的 c++ 构建到一个“胖”共享库中,其中包含所有使用的库中的所有符号,以便在新机器上如果我只是复制胖 .so 文件一切正常。 如果那不可能,那么您能帮我修复当前的构建过程吗?这就是我目前正在做的 -
1)在本地 VM(ubuntu 64)上,我使用 -fPIC 标志编译 ffmpeg 代码并使用 apt-get 命令安装 h264 和 boost。
2) 在同一个虚拟机上,我使用 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 应用程序的新机器上。我使用 apt-get 命令安装 h264 和 boost 并将 ffmpeg 的编译库文件复制到 /usr/local/lib。
4) 将 final.so 文件复制到这台新机器上。但是当 java 代码尝试使用 final.so 文件时,我看到它尝试使用奇怪命名的文件。例如 - 它试图找到 libavcodec.so.57 、 libavformat.so.57 等来解决这个问题我刚刚创建了这些文件的副本,即复制到 libavcodec.so.57 的 libavcodec.so。
5) 但是这些 ffmpeg 库又使用了一个不同名称的 lib264.so 文件。在我的新机器上,用于 x264 的 apt-get 命令安装了一个名为 libx264.so.148 的文件,但是 ffmpeg 库之一正在搜索文件 libx264.so.142 即使我重命名此 libx264.so 文件我在 ffmpeg 库的位置出现新错误尝试调用附有这些数字的 libx264 的方法。
6) 目前对我来说唯一可行的选择是将 c++ 代码带到每台新机器上并在本地构建 final.so 文件。这是我想避免的事情,因为我想将 .so 文件与 jar 文件一起分发给我的客户,他们可以轻松使用,而无需构建和安装东西。
【问题讨论】: