繁体   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