• 7419阅读
  • 17回复

[提问]QT静态编译疑问 [复制链接]

上一主题 下一主题
离线5xinfeiyang
 
只看楼主 倒序阅读 楼主  发表于: 2011-11-25
最近在学习QT,已经在Ubuntu中安装好了qt-embedded-linux-opensource-src-4.5.3(配置时加了-static选项)也安装了arm-linux-gcc-3.4.1和qt-x11-opensource-src-4.5.3。我用了一个简单的Hello world程序做测试,在Ubuntu中成功了,后交叉编译,执行/usr/local/Trolltech/qte/bin/qmake -project和/usr/local/Trolltech/qte/bin/qmake 最后make生成可执行文件,将可执行拷贝到开发板中执行./hello -qws提示我-sh: ./hello: not found。这个是什么原因呀?是参数没有设置吗?附:我希望静态编译后的可执行程序可以脱离库,直接将可执行程序拷贝到开发板中执行看到最终效果,请问这个想法可行吗?
离线wxj120bw

只看该作者 1楼 发表于: 2011-11-25
回 楼主(5xinfeiyang) 的帖子
ls -l hello 看这个文件在当前用户下有执行权限吗
离线5xinfeiyang
只看该作者 2楼 发表于: 2011-11-26
我试了一下,在Ubuntu中先sudo chmod 777 hello了,用ls -l hello 查看是-rwxrwxrwx 1 root root 12972001 2011-11-25 20:04 hello
拷贝到开发板中我先# ls -l hello查看了一下显示-rwxr-xr-x    1 root     root     12972001 Aug 30 07:19 hello,执行 ./hello -qws时还是提示-sh: ./hello: not found。难道还是却好库文件?我编译完的hello可执行文件是13M左右了

离线wxj120bw

只看该作者 3楼 发表于: 2011-11-26
回 2楼(5xinfeiyang) 的帖子
换成绝对路径看看
离线5xinfeiyang
只看该作者 4楼 发表于: 2011-11-26
额,不好意思,能麻烦您说的再详细点吗?还有我在网上搜这个问题时。好多人都说不可行,必须要移植库文件到arm开发板上,是这样吗?
离线ppdayz

只看该作者 5楼 发表于: 2011-11-26
完全不对的~
你只是静态编译了X86的,你的程序hello里面都是x86的。
要想能在arm里跑,感觉用静态编译的比较麻烦
主要是你的x86的版本要在你的机器上把x86的qt库编进去
arm的版本要把你的机器上的arm的qt库编进去
这样会很麻烦。。。很麻烦
离线5xinfeiyang
只看该作者 6楼 发表于: 2011-11-26
原来是这样呀,那我可以在PC机上静态编译一个程序,在另一台没有安装QT也没有QT库的PC机上运行吗?这样的话可行吗?
离线muqiujuan
只看该作者 7楼 发表于: 2011-11-26
回 6楼(5xinfeiyang) 的帖子
这个当然可以
离线5xinfeiyang
只看该作者 8楼 发表于: 2011-11-26
恩,我重新配置了qt-x11(加上了-static等参数)后试了一下,在一个目录中进行编译生成可执行文件hello(10几M大小),然后把hello复制到了随便一个自己建立的文件夹下,执行也可以,这应该跟移植到另一台没有安装qt和qt库的机器上运行一样吧?还有我还是想问你一下最初的问题,移植到一个arm开发板中,或者可以将最后可执行程序需要的库挑出来移植到开发板而不全部移植,这个方法或者思路,谢谢你
离线wxj120bw

只看该作者 9楼 发表于: 2011-11-27
回 8楼(5xinfeiyang) 的帖子
在linux下确认程序运行的平台 用file hello命令 看打印信息就知道了 只要可执行程序加载的库能找到
离线5xinfeiyang
只看该作者 10楼 发表于: 2011-11-27
在linux下执行file hello显示hello: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.4.3, not stripped。
用arm-linux-readelf -a hello | grep "Shared library"查看显示
0x00000001 (NEEDED)                     Shared library: [librt.so.1]
0x00000001 (NEEDED)                     Shared library: [libdl.so.2]
0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
0x00000001 (NEEDED)                     Shared library: [libm.so.6]
0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED)                     Shared library: [libc.so.6]
这些库都要拷到开发板的/lib目录下吗?有些是链接,也要将其链接的库拷到开发板吧?但是太大了呀
离线wxj120bw

只看该作者 11楼 发表于: 2011-11-27
回 10楼(5xinfeiyang) 的帖子
你的hello的确是arm平台的 同样的方法确认librt.so.1等文件是不是arm平台的 若是 拷贝到/lib目录下 不用管大小
离线5xinfeiyang
只看该作者 12楼 发表于: 2011-11-28
哎,发现问题了,我执行了locate librt.so.1命令显示如下:
/home/yajun/usr/local/arm/3.4.1/arm-linux/lib/librt.so.1
/lib/librt.so.1
/lib/tls/i686/cmov/librt.so.1
/usr/local/arm/3.4.1/arm-linux/lib/librt.so.1我查看第一个的属性file /lib/librt.so.1 ,显示/lib/librt.so.1: symbolic link to `librt-2.11.1.so'我同样找到librt-2.11.1.so查看其属性是/lib/librt-2.11.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped这个不是ARM的,但是我查看/usr/local/arm/3.4.1/arm-linux/lib/librt.so.1属性是/usr/local/arm/3.4.1/arm-linux/lib/librt.so.1: symbolic link to `librt-2.3.2.so',我找到librt-2.3.2.so后再查看属性是/usr/local/arm/3.4.1/arm-linux/lib/librt-2.3.2.so: ELF 32-bit LSB shared object, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.4.3, not stripped这个是ARM的了,那我就是要把所有适合ARM的库以及链接全部拷贝到开发板的/lib目录下吧,先试试,不行再研究,谢谢


离线5xinfeiyang
只看该作者 13楼 发表于: 2011-11-28
刚刚试了一下,需要链接以及库一共这么多,
libc.so.6    libc-2.3.2.so    libdl.so.2    libdl-2.3.2.so    libgcc_s.so.1
libm.so.6   libm-2.3.2.so    libpthread.so.0   libpthread-0.10.so   librt.so.1
librt-2.3.2.so   libstdc++.so.6    libstdc++.so.6.0.1,我把这些库拷到我U盘一个文件夹ku中,挂载U盘到开发板,进入/mnt/usb/ku目录下,ls查看时提示了ls: error while loading shared libraries: ld-linux.so.2: cannot open shared object file: No such file or directory又在Ubuntu中找到了ld-linux.so.2库,放到U盘的ku文件夹中,再挂载,ls后又提示ls: libm.so.6: version `GLIBC_2.4' not found (required by ls)
ls: libc.so.6: version `GLIBC_2.4' not found (required by ls),在开发板的/lib目录下找到了这两个库,拷贝到了ku文件夹下,再ls终于看到了内容,将文件夹中的库拷到开发板/lib目录下,执行umount -a卸载U盘时提示
umount: /lib/libgcc_s.so.1: version `GCC_3.5' not found (required by /usr/lib/libblkid.so.1)
umount: /lib/libgcc_s.so.1: version `GCC_3.5' not found (required by /usr/lib/libuuid.so.1)
umount: /lib/libc.so.6: version `GLIBC_2.2.4' not found (required by /lib/libgcc_s.so.1)
umount: /lib/libc.so.6: version `GLIBC_2.1.3' not found (required by /lib/libgcc_s.so.1)
umount: /lib/libc.so.6: version `GLIBC_2.0' not found (required by /lib/libgcc_s.so.1),其中libgcc_s.so.1这个库在文件夹没有,但是libc.so.6这个库已经有了呀,是因为版本的问题吗?如何查看呢?好纠结。。。
离线wxj120bw

只看该作者 14楼 发表于: 2011-11-28
回 13楼(5xinfeiyang) 的帖子
终端有个环境变量PATH(应该是这个) 你执行下echo $PATH 看结果有库所在的路径
PS:白天较忙 无法及时回复
离线yanxinorg
只看该作者 15楼 发表于: 2011-11-28
回 6楼(5xinfeiyang) 的帖子
不行的
离线5xinfeiyang
只看该作者 16楼 发表于: 2011-11-29
啊!能说的详细点吗?原因究竟是在哪里?还有如何才能在开发板看到这个小界面呀?求指点,只能动态编译吗?
离线5xinfeiyang
只看该作者 17楼 发表于: 2011-11-29
我在开发板执行echo $PATH显示如下:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin,我是要把库和链接文件拷到这些文件夹下嘛?这下面不都是可执行文件吗?
快速回复
限100 字节
 
上一个 下一个