Linux下的ldd命令可以查看一个可执行文件/共享库/静态库的依赖, 但是想得到这些依赖文件, 必须手动去找,非常麻烦
这里是一个Shell可以将依赖列表中的文件拷贝到指定目录
deplist=$( ldd $1 | awk '{if (match($3,"/")){ print $3}}' )
cp $deplist $2
代码解释: ldd导出列表, 这个列表打印出来很丑
linux-gate.so.1 => (0x00ed2000)
liblog4cpp.so.4 => /usr/local/lib/liblog4cpp.so.4 (0x00657000)
libprotobuf.so.7 => /usr/local/lib/libprotobuf.so.7 (0x00360000)
libboost_filesystem.so.1.48.0 => /usr/local/lib/libboost_filesystem.so.1.48.0 (0x00a9a000)
libboost_program_options.so.1.48.0 => /usr/local/lib/libboost_program_options.so.1.48.0 (0x00110000)
libboost_system.so.1.48.0 => /usr/local/lib/libboost_system.so.1.48.0 (0x00a85000)
libboost_thread.so.1.48.0 => /usr/local/lib/libboost_thread.so.1.48.0 (0x00179000)
libunwind-x86.so.7 => /usr/lib/libunwind-x86.so.7 (0x00821000)
libluabindd.so.0.9.0 => /usr/local/lib/libluabindd.so.0.9.0 (0x00bb3000)
libmysqlpp.so.3 => /usr/local/lib/libmysqlpp.so.3 (0x00de5000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x001a9000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x00782000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x00aea000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00447000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x00abd000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x00193000)
libnsl.so.1 => /lib/i386-linux-gnu/libnsl.so.1 (0x00294000)
libunwind.so.7 => /usr/lib/libunwind.so.7 (0x002ab000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x00e8a000)
libmysqlclient_r.so.16 => /usr/lib/libmysqlclient_r.so.16 (0x0083b000)
/lib/ld-linux.so.2 (0x00608000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0x002c0000)
我们发现第一行的so没有对应的库地址, 因此我们使用awk的脚本功能,判断第三个参数,也就是=>之后的路径必须包含/
之后将第一行的输出重定向到变量中, 再使用cp指令从列表拷贝到指定目录