gcc编译python可执行_如何编译可以在Windows下运行的带有Python支持的ARM Linux GDB

本文介绍了如何在Ubuntu环境下,使用MinGW交叉编译带Python支持的ARM Linux GDB,以解决在QtCreator中调试时查看Qt对象内容的问题。涉及配置、依赖库如expat和Python的交叉编译,以及GDB源码的修补过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

展开全部

做这件事情的目的是为了在QtCreator里调试ARM Linux程序的时候,能看清楚QString、QList这些e69da5e887aa3231313335323631343130323136353331333363353834Qt特有的对象的内容,而不是一个完全看不懂的结构体。

目前(2014年8月)Linaro、CodeSourcery的GCC工具链里的GDB都不支持Python。想知道你用的GDB支持不支持,试一试就行,这样表示不支持:

(gdb) python

>print 'Hello GDB!'

>(按Ctrl+D)Python scripting is not supported in this copy of GDB.

这样表示支持:

(gdb) python

>print 'Hello GDB!'

>(按Ctrl+D)Hello GDB!

这件事情乍一看也很简单,只要把GDB源码下载下来,然后再配置,打开Python支持就行了。实际上会遇到的问题是,在MinGW下,又要与“\”和“:”这两个Windows路径里的刺头斗争了。我觉得我之前挺傻,编译MinGW下Qt的时候,就去硬磕源码和configure脚本去了。这次GDB的configure是自动生成的,不是给人看的,configure.ac看起来也很费劲,根本磕不下去,于是我换了个思路,在ubuntu下交叉编译吧,sudo apt-get install mingw32,这是Ubuntu下的MinGW交叉编译器。

然后是依赖,这样的GDB要依赖expat和python的开发版本。如果是ubuntu底下直接编译,apt-cache search一下他们的开发版本,然后sudo apt-get install一下就好了;给MinGW交叉编译就麻烦了。先说expat,这个好办,把http://downloads.sourceforge.net/project/expat/expat/2.1.0/expat-2.1.0.tar.gz下载下来,然后:

./configure --prefix=[安装目录,如/home/cdu/mingw-gdb/expat] --host=i586-mingw32msvc

make

make install

会提示一些警告,无视即可。

Python就无语了,目前的GDB貌似最高支持Python 2.7,而2.7版本的Python本身不支持MinGW…… 好在有高手做了Patch,也写了说明,可以参考这文章:http://mdqinc.com/blog/2011/10/cross-compiling-python-for-windows-with-mingw32/

但是,就算这样,编译也充满挑战,要修复很多问题,出来的Python还少“nt”模块。就在我觉得没办法的时候,突然发现Windows版Qt提供的MinGW居然内置了Python开发包,位置在Tools/mingw48_32/opt,赶紧把它拷贝到Linux下,比如/home/cdu/mingw-gdb/python。当然,你也必须确保ubuntu下有可用的python。

然后,给GDB打一个补丁:

--- gdb-7.8/gdb/configure 2014-07-29 20:37:42.000000000 +0800

+++ gdb-7.8-old/gdb/configure 2014-08-30 00:08:27.122042706 +0800

@@ -8263,21 +8263,22 @@

# We have a python program to use, but it may be too old.

# Don't flag an error for --with-python=auto (the default).

have_python_config=yes

- python_includes=`${python_prog} ${srcdir}/python/python-config.py --includes`

+ python_config_tool=`echo ${python_prog} | sed "s#python.exe#python-config#g"`

+ python_includes=`${python_config_tool} --includes`

if test $? != 0; then

have_python_config=failed

if test "${with_python}" != auto; then

as_fn_error "failure running python-config --includes" "$LINENO" 5

fi

fi

- python_libs=`${python_prog} ${srcdir}/python/python-config.py --ldflags`

+ python_libs=`${python_config_tool} --ldflags`

if test $? != 0; then

have_python_config=failed

if test "${with_python}" != auto; then

as_fn_error "failure running python-config --ldflags" "$LINENO" 5

fi

fi

- python_prefix=`${python_prog} ${srcdir}/python/python-config.py --exec-prefix`

+ python_prefix=`${python_config_tool} --exec-prefix`

if test $? != 0; then

have_python_config=failed

if test "${with_python}" != auto; then

@@ -8343,12 +8344,12 @@

return 0;

}

_ACEOF

-if ac_fn_c_try_link "$LINENO"; then :

+#if ac_fn_c_try_link "$LINENO"; then :

have_libpython=${version}

found_usable_python=yes

PYTHON_CPPFLAGS=$new_CPPFLAGS

PYTHON_LIBS=$new_LIBS

-fi

+#fi

rm -f core conftest.err conftest.$ac_objext \

conftest$ac_exeext conftest.$ac_ext

CPPFLAGS=$save_CPPFLAGS

这个补丁的目的是强制为检测到python。

然后给拷贝到Linux下的python开发包打一个补丁:

--- python-old/bin/python-config 2013-04-18 02:43:01.000000000 +0800

+++ python/bin/python-config 2014-08-30 00:53:16.630060288 +0800

@@ -1,4 +1,4 @@

-#!/temp/x32-480-posix-dwarf-r2/mingw32/opt/bin/python2.7.exe

+#!/usr/bin/python

import sys

import os

@@ -31,26 +31,23 @@

for opt in opt_flags:

if opt == '--prefix':

- print sysconfig.PREFIX

+ print '../python'

elif opt == '--exec-prefix':

- print sysconfig.EXEC_PREFIX

+ print '../python'

elif opt in ('--includes', '--cflags'):

- flags = ['-I' + sysconfig.get_python_inc(),

- '-I' + sysconfig.get_python_inc(plat_specific=True)]

+ flags = ['-I' + os.path.split(os.path.realpath(__file__))[0] + '/../include/python2.7']

if opt == '--cflags':

- flags.extend(getvar('CFLAGS').split())

+ flags += ['-fno-strict-aliasing -DMS_WIN32 -DMS_WINDOWS -DHAVE_USABLE_WCHAR_T -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes']

print ' '.join(flags)

elif opt in ('--libs', '--ldflags'):

- libs = getvar('LIBS').split() + getvar('SYSLIBS').split()

- libs.append('-lpython'+pyver)

+ libs = ['-lm -lpython2.7 -Wl,--out-implib=libpython2.7.dll.a']

# add the prefix/lib/pythonX.Y/config dir, but only if there is no

# shared library in prefix/lib/.

if opt == '--ldflags':

if not getvar('Py_ENABLE_SHARED'):

- libs.insert(0, '-L' + getvar('LIBPL'))

- libs.extend(getvar('LINKFORSHARED').split())

+ libs.insert(0, '-L' + os.path.split(os.path.realpath(__file__))[0] + '/../lib/python2.7/config')

print ' '.join(libs)

因为Linux下是无法运行开发包中的python.exe的,所以这个补丁借用了ubuntu的python。里面的cflags和ldflags都是在Windows底下运行原始python-config获得的。prefix和exec-prefix设成“../python”,可以在编译完以后,把python开发包拷贝到gdb安装目录里面的python子目录,这样运行GDB的时候就不需要设定PYTHONHOME环境变量了。

最后一个事情,确保你的Linux下有arm交叉编译器,我的是arm-linux-gnueabihf,是啥target就写啥。

准备工作做完了,开始配置和编译:

./configure --with-expat --host=i586-mingw32msvc --target=arm-linux-gnueabihf --with-libexpat-prefix=[expat安装位置] --with-python=[python开发包安装位置/bin/python.exe]

make

make DESTDIR=[GDB安装位置] install

然后把GDB安装位置下面的所有文件拷贝到Windows下,再把python开发包拷贝到同目录下的python子目录,大功告成。

如果提示没找到libpython2.7.dll,那就把GDB安装目录的python/bin下的拷贝到bin下。

如果发现生成的exe文件太大了,那就strip一下。

2015年9月12日追加:

在windows下调试时,一般会提示说加载不了共享库,让你用"set sysroot"或"set solib-search-path"之类设定路径的。这个问题可以通过.gdbinit文件,用上面这两条命令来设定路径解决,如果想一劳永逸,可以在编译的时候加上host_configargs环境变量来解决这个问题:

host_configargs=--with-sysroot=E:\MinGW\opt\sysroot-arm ./configure ...

或者

export host_configargs=--with-sysroot=E:\MinGW\opt\sysroot-arm

./configure ...

后面的路径是你放在windows下的sysroot的位置。

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

### ARM 平台 GDB 调试编译源码教程 为了在 ARM 平台上成功编译并使用 GDB 进行调试,以下是详细的说明以及相关知识点。 #### 准备工作 首先需要准备的是 GDB 的源码包。可以通过官方 FTP 地址获取最新版本的 GDB 源码[^4]。例如,在本案例中使用的版本为 8.2 版本。下载完成后将其传输至 Linux X86 系统,并完成解压操作。 #### 创建生成目录 进入已解压的 GDB 源码根目录后,建议新建一个专门用于构建的子目录来保持环境整洁。此步骤有助于分离源代码与生成文件,便于后续维护和清理。 #### 配置交叉编译环境变量 对于 ARM 架构的目标设备而言,必须设置合适的工具链路径以便于正确识别目标体系结构。通常情况下会涉及到 `arm-none-linux-gnueabi` 工具链前缀定义。如果需要定位特定库的位置,则可通过如下方式查询标准 C 库的实际位置: ```bash arm-none-linux-gnueabi-gcc -print-file-name=libc.a ``` 上述命令能够帮助开发者找到链接阶段所需的静态或者动态共享对象的具体存储地址[^2]。 #### 执行配置脚本 切换到之前建立好的 build 文件夹内部之后,调用 configure 命令来进行初始化设定过程。这里需要注意几个重要参数的选择: - **--target**: 明确指出最终产物所适配的操作系统及其硬件平台组合形式; - **--prefix**: 自定义安装完毕后的默认部署基线路径; - **其他选项**:依据实际需求增减附加功能模块开关状态等额外定制化内容。 典型示例可能看起来像这样: ```bash ../configure --target=arm-linux-gnu --prefix=/opt/cross-arm-tools ``` 以上实例中的 prefix 参数决定了最后生成的所有二进制可执行档会被放置在哪一层次级下的 bin 子目录之中[^5]。 #### 开始编译流程 一旦所有的前期准备工作都已完成无误的话,就可以正式开启 make 流程了。这一步骤可能会花费较长时间视乎主机性能高低而定。期间如果有任何错误发生都应该仔细阅读报错信息尝试解决后再继续前进直至整个项目顺利完成为止。 ```bash make -j$(nproc) ``` 利用 nproc 获取 CPU 核心数从而实现多进程加速效果提升效率。 #### 安装成果物 当确认没有任何异常状况存在时即可运行 install 步骤把刚才制作出来的各个组件妥善安置到位供日后正常使用之需。 ```bash sudo make install ``` 至此便已经拥有了专属于自己的针对 ARM 设计优化过的 GDB 调试解决方案啦! --- ### 示例代码片段展示 下面给出一段简单的 Python 实现快速排序算法的例子作为补充材料参考: ```python def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) if __name__ == "__main__": test_list = [3, 6, 8, 10, 1, 2, 1] sorted_list = quick_sort(test_list) print(sorted_list) ``` 尽管这段代码并非直接关联主题讨论范围之内,但它很好地体现了递归逻辑思维模式的应用场景之一——即通过不断分割问题规模直到达到基础情形再逐步回溯重组得到全局最优解答的过程[^1]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值