Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 动态库的大小大于静态库和链接对象大小之和,这是怎么回事?_Opencv_Gcc_Android Ndk_Shared Libraries_Static Libraries - Fatal编程技术网

Opencv 动态库的大小大于静态库和链接对象大小之和,这是怎么回事?

Opencv 动态库的大小大于静态库和链接对象大小之和,这是怎么回事?,opencv,gcc,android-ndk,shared-libraries,static-libraries,Opencv,Gcc,Android Ndk,Shared Libraries,Static Libraries,[请参见编辑,看起来额外的大小来自于在链接时添加的调试符号,但发生这种情况的原因尚不清楚!] 我正在交叉编译OpenCV 2.4.11 Ubuntu x86 64位->armeabi 我正在使用这里提供的工具链,选择4.9编译器 当我编译动态库时,它们比静态库大得多。示例: 3793082 Mar 12 17:21 libopencv_core.a 6131716 Mar 12 17:29 libopencv_core.so 446060 Mar 12 17:22 libopencv_h

[请参见编辑,看起来额外的大小来自于在链接时添加的调试符号,但发生这种情况的原因尚不清楚!]

我正在交叉编译OpenCV 2.4.11 Ubuntu x86 64位->armeabi

我正在使用这里提供的工具链,选择4.9编译器

当我编译动态库时,它们比静态库大得多。示例:

 3793082 Mar 12 17:21 libopencv_core.a
 6131716 Mar 12 17:29 libopencv_core.so
  446060 Mar 12 17:22 libopencv_highgui.a
 5510352 Mar 12 17:30 libopencv_highgui.so
 3477794 Mar 12 17:21 libopencv_imgproc.a
 5325504 Mar 12 17:29 libopencv_imgproc.so
   38004 Mar 12 17:19 libopencv_info.so
  844990 Mar 12 17:21 libopencv_ml.a
 3827136 Mar 12 17:29 libopencv_ml.so
  747744 Mar 12 17:22 libopencv_objdetect.a
 2370188 Mar 12 17:30 libopencv_objdetect.so
  405920 Mar 12 17:22 libopencv_video.a
 2196268 Mar 12 17:30 libopencv_video.so
对于静态库,大小或多或少与对象文件的总大小相对应。core和highgui的示例

du -chs `find -iname \*.o|grep opencv_core.dir`
[...]
3,5M    total

du -chs `find -iname \*.o|grep opencv_highgui.dir`
[...]
352K    total
如果我用make或忍者建造,也会发生同样的情况

构建时编译器标志之间只有一点差异,但是如果我检查为静态构建和动态构建生成的对象文件,它们的大小完全相同。这是我用来生成这样一个列表的命令:

ls -s `find -iname \*.o`|grep core
所以,我想,一定是在连接阶段。我查看了build.ninja文件的差异,以下是仅针对共享版本的行:

LINK_FLAGS = -llog -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now
LINK_LIBRARIES = lib/libopencv_features2d.so -ldl -lm -llog -ltbb lib/libopencv_flann.so lib/libopencv_highgui.so lib/libopencv_imgproc.so lib/libopencv_core.so
我不认为附加的链接库(dl、m、log、tbb)会影响最终的大小,因为它们都比我发现的差异小得多。此外,我开始验证,对于日志,只有.so可用,对于tbb(100Kb),我有共享版本和静态版本。顺便说一句,我试图建立也没有tbb

为了100%确定,我使用了链接对象文件的实际命令行,删除了
-no undefined选项
,然后删除了所有其他选项和链接库。文件大小没有改变,除了删除
-Wl,--gc节时,这导致文件大小增加(这是一些垃圾收集选项)

所以,剩下的唯一选择是。。。链接器错误?!?有人知道发生了什么吗

一些附加信息:

编译器详细信息:

 ./arm-linux-androideabi-gcc -v
Using built-in specs.
COLLECT_GCC=./arm-linux-androideabi-gcc
COLLECT_LTO_WRAPPER=/opt/toolchain-arm17/bin/../libexec/gcc/arm-linux-androideabi/4.9/lto-wrapper
Target: arm-linux-androideabi
Configured with: /s/ndk-toolchain/src/build/../gcc/gcc-4.9/configure --prefix=/tmp/ndk-andrewhsieh/build/toolchain/prefix --target=arm-linux-androideabi --host=x86_64-linux-gnu --build=x86_64-linux-gnu --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --with-gmp=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-mpfr=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-mpc=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-cloog=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-isl=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-ppl=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --disable-ppl-version-check --disable-cloog-version-check --disable-isl-version-check --enable-cloog-backend=isl --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --disable-libssp --enable-threads --disable-nls --disable-libmudflap --disable-libgomp --disable-libstdc__-v3 --disable-sjlj-exceptions --disable-shared --disable-tls --disable-libitm --with-float=soft --with-fpu=vfp --with-arch=armv5te --enable-target-optspace --enable-initfini-array --disable-nls --prefix=/tmp/ndk-andrewhsieh/build/toolchain/prefix --with-sysroot=/tmp/ndk-andrewhsieh/build/toolchain/prefix/sysroot --with-binutils-version=2.24 --with-mpfr-version=3.1.1 --with-mpc-version=1.0.1 --with-gmp-version=5.0.5 --with-gcc-version=4.9 --with-gdb-version=7.6 --with-python=/usr/local/google/home/andrewhsieh/mydroid/ndk/prebuilt/linux-x86_64/bin/python-config.sh --with-gxx-include-dir=/tmp/ndk-andrewhsieh/build/toolchain/prefix/include/c++/4.9 --with-bugurl=http://source.android.com/source/report-bugs.html --enable-languages=c,c++ --disable-bootstrap --enable-plugins --enable-libgomp --disable-libsanitizer --enable-gold --enable-graphite=yes --with-cloog-version=0.18.0 --with-isl-version=0.11.1 --enable-eh-frame-hdr-for-static --with-arch=armv5te --program-transform-name='s&^&arm-linux-androideabi-&' --enable-gold=default
Thread model: posix
gcc version 4.9 20140827 (prerelease) (GCC) 
我还试着看看在尝试另一个版本的链接器时会发生什么,但大小没有变化

arm-linux-androideabi-g++.exe -v
Using built-in specs.
COLLECT_GCC=arm-linux-androideabi-g++.exe
COLLECT_LTO_WRAPPER=lto-wrapper.exe
Target: arm-linux-androideabi
Configured with: /s/ndk-toolchain/src/build/../gcc/gcc-4.8/configure --prefix=/tmp/ndk-andrewhsieh/build/toolchain/prefix --target=arm-linux-androideabi --host=x86_64-pc-mingw32msvc --build=x86_64-lin
ux-gnu --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --with-gmp=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-mpfr=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-mpc=/tmp/n
dk-andrewhsieh/build/toolchain/temp-install --with-cloog=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-isl=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-ppl=/tmp/ndk-andrewhsieh/
build/toolchain/temp-install --disable-ppl-version-check --disable-cloog-version-check --disable-isl-version-check --enable-cloog-backend=isl --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc+
+,-Bdynamic -lm' --disable-libssp --enable-threads --disable-nls --disable-libmudflap --disable-libgomp --disable-libstdc__-v3 --disable-sjlj-exceptions --disable-shared --disable-tls --disable-libitm
 --with-float=soft --with-fpu=vfp --with-arch=armv5te --enable-target-optspace --enable-initfini-array --disable-nls --prefix=/tmp/ndk-andrewhsieh/build/toolchain/prefix --with-sysroot=/tmp/ndk-andrew
hsieh/build/toolchain/prefix/sysroot --with-binutils-version=2.24 --with-mpfr-version=3.1.1 --with-mpc-version=1.0.1 --with-gmp-version=5.0.5 --with-gcc-version=4.8 --with-gdb-version=7.6 --with-pytho
n=/usr/local/google/home/andrewhsieh/mydroid/ndk/prebuilt/windows-x86_64/bin/python-config.sh --with-gxx-include-dir=/tmp/ndk-andrewhsieh/build/toolchain/prefix/include/c++/4.8 --with-bugurl=http://so
urce.android.com/source/report-bugs.html --enable-languages=c,c++ --disable-bootstrap --enable-plugins --enable-libgomp --disable-libsanitizer --enable-gold --enable-graphite=yes --with-cloog-version=
0.18.0 --with-isl-version=0.11.1 --enable-eh-frame-hdr-for-static --with-arch=armv5te --program-transform-name='s&^&arm-linux-androideabi-&' --enable-gold=default
Thread model: posix
gcc version 4.8 (GCC)
编辑:
按照马尔克的建议,我试着去图书馆。结果令人惊讶(对我来说:)

如果在没有-g(甚至是-g0)的情况下编译对象文件,那么所有这些调试符号都出现在哪里?

注意:像这样剥离的库似乎功能齐全。剥离/未剥离库的
nm-D
输出是相同的,并且
nm
输出只少了几行(比如12000行中少了50行)

为了确保这一点,我还尝试在链接之前剥离对象,但它们的文件没有改变(只是增加了一点),链接“剥离”的对象文件会生成一个与以前相同大小的库。

这些不是调试符号。它们是常规链接器符号

共享库可能有两组符号:一组用于链接,另一组用于动态加载<代码>条带
删除第一类符号。您不能链接到剥离的共享库,但可以在正常运行时加载它(例如,如果使用
dlopen
,或者链接到库,然后剥离它)

在运行
strip
之前和之后,请参见
nm-yourlib.so
nm-D yourlib.so


更正可以与剥离库链接。关于这两种符号表的一个很好的解释是。

调试符号?你试过剥离文件吗?@MarcB我不知道剥离,谢谢!我试过了,请看一下结果,看起来你走对了路!有用链接1)为什么条形图指南会说“-g->仅删除调试符号。”?2) 剥离和非剥离的
nm-D
输出相同。这意味着什么?…剥离的库似乎功能齐全,在链接时也是如此。我已经在问题中添加了nm信息。另一个注释:我可以在链接选项中添加-s,我得到了更小但显然可用的库。我想知道为什么我可以使用-s来创建一个。因此,它说“从可执行文件中删除所有符号表和重新定位信息”。没错,可以链接到带条库,请参阅更新。现在有点晚了,但如果您可以从链接页中添加一些要点,我肯定可以接受答案。
$ arm-linux-androideabi/bin/strip -g libopencv_core.so -o libopencv_core_stripped.so
$ ls -la *core*
6293308 Mar 13 10:40 libopencv_core.so
3224840 Mar 13 12:18 libopencv_core_stripped.so