FB AS3 中,使用条件编译,实现debug、release的代码分离编译。

本文介绍了一种在Flex中利用条件编译进行代码管理和测试的方法。通过实例演示了如何使用CONFIG宏定义区分debug与release版本,使测试代码更加灵活可控。

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

如题:


FB AS3 中,使用条件编译,效果类似:VS的#if DEBUG与#if RELEASE,相比之下,FB中的宏定义更灵活


这样做,我们测试代码就可以更灵活的管理了。


在网上搜查了一下相关资料,得出DEMO:以下是我的个人测试:







源码:


package
{
	import flash.display.Sprite;
	
	/**
	 *  Create By Jave.Lin(afeng)<br/>
	 *  2012-7-9 上午9:49:18<br/>
	 *  <b/>
	 *  [description]
	 **/
	public class TestConfigDebug extends Sprite
	{
		public function TestConfigDebug()
		{
			super();
			
			
			CONFIG::debug{
				function test():void
				{
					trace("debug test function");
				}
				trace("[debug trace : 1111111]");
			};
			
			trace("normal trace : 11111111");
			
			CONFIG::release{
				function test():void
				{
					trace("release test function");
				}
				trace("release trace : 2323112314");
			}
			
			trace("normal trace : [2222222]");
			test();
			
			trace("CONFIG::TEST_DEFINE_CONST's value : ",CONFIG::TEST_DEFINE_CONST);
			trace("TEST::FLAG's value : ",TEST::FLAG);
		}
	}
}

<think>我们正在解决交叉编译Qt时遇到的GLIBC_2.34 not found错误。这个错误通常是因为编译环境(宿主系统)的glibc版本高于目标系统的glibc版本。在交叉编译时,我们使用的高版本glibc的工具链编译出的程序依赖了高版本的glibc,而目标系统上安装的是较低版本的glibc,因此无法运行。 解决方法的核心是:使用与目标系统glibc版本兼容的工具链进行编译。具体步骤如下: 1. **确认目标系统的glibc版本**:在目标系统上运行命令`ldd --version`,查看glibc的版本。假设目标系统最高支持glibc 2.33,而我们宿主机的工具链使用了glibc 2.34,那么就会导致此错误。 2. **获取或构建兼容的工具链**:我们需要使用一个不高于目标系统glibc版本的交叉工具链。可以采取以下方法: - 从目标系统供应商获取官方工具链。 - 使用crosstool-ng等工具自定义构建一个匹配目标系统glibc版本的交叉工具链。 - 如果已有工具链版本过高,可以尝试降低工具链的版本。 3. **配置Qt使用正确的工具链**:在配置Qt时,通过`-xplatform`参数指定正确的mkspec,并在该mkspec中指定使用兼容的交叉工具链。 4. **在配置时显式指定sysroot**:如果目标系统的根文件系统可用(通常包含库和头文件),我们可以使用`-sysroot`选项指定目标系统的根文件系统路径,这样编译器就会链接目标系统的库。 5. **避免使用宿主机的库**:确保在配置Qt时,禁用了对宿主机专有库的依赖,强制使用Qt自带的库或目标系统根文件系统中的库。 根据用户提供的引用[1]中的配置示例,他们使用了`-xplatform qws/linux-arm-g++`,因此我们需要检查这个mkspec文件(位于qtbase/mkspecs/qws/linux-arm-g++)中指定的交叉编译器路径和选项。 具体步骤: 步骤1:检查目标系统glibc版本 在目标板上运行: ```bash ldd --version ``` 记录下版本信息(例如:ldd (Ubuntu GLIBC 2.31-0ubuntu9.9) 2.31)。 步骤2:检查宿主机的交叉工具链的glibc版本 在宿主机上,使用交叉工具链中的libc.so来查看支持的GLIBC版本: ```bash arm-linux-gcc -print-file-name=libc.so ``` 然后使用该路径,运行: ```bash strings <path_to_libc.so> | grep GLIBC_ ``` 查看输出的最高版本。如果最高版本高于目标系统的glibc版本(例如出现了GLIBC_2.34),则需要更换工具链。 步骤3:更换合适的交叉工具链 如果发现工具链版本过高,需要寻找或构建一个与目标系统glibc版本匹配的工具链。例如,目标系统是glibc 2.31,那么工具链的glibc版本应该不高于2.31。 步骤4:配置Qt使用新的工具链 确保在mkspec文件(例如:qtbase/mkspecs/qws/linux-arm-g++/qmake.conf)中指向新的工具链。 步骤5:在配置Qt时指定sysroot(可选但推荐) 如果拥有目标系统的根文件系统(例如通过NFS挂载或复制到宿主机),可以在配置时添加`-sysroot /path/to/rootfs`。 步骤6:重新配置和编译Qt 使用类似以下配置命令(参考引用[1]并修改): ```bash ./configure -verbose -prefix /usr/local/Trolltech/QtEmbedded-4.6.3-arm \ -opensource -confirm-license -release -shared -embedded arm \ -xplatform qws/linux-arm-g++ -depths 16,18,24 -fast -optimized-qmake \ -pch -qt-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype \ -little-endian -host-little-endian -no-qt3support -no-libtiff -no-libmng \ -no-opengl -no-mmx -no-sse -no-sse2 -no-3dnow -no-webkit -no-qvfb \ -no-phonon -no-nis -no-opengl -no-cups -no-glib -no-xcursor -no-xfixes \ -no-xrandr -no-xrender -no-separate-debug-info -nomake examples \ -nomake tools -nomake docs -qt-gfx-transformed -qt-gfx-linuxfb \ -qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib \ -qt-kbd-linuxinput \ -sysroot /path/to/target/rootfs # 添加sysroot参数 ``` 步骤7:编译并安装 ```bash make -j$(nproc) make install ``` 步骤8:验证生成的程序 使用`readelf`查看生成的Qt库或测试程序的动态段,确认没有高版本的glibc依赖: ```bash arm-linux-readelf -d lib/libQtCore.so.4.6.3 | grep GLIBC ``` 应该只显示目标系统支持的GLIBC版本(如GLIBC_2.4、GLIBC_2.31等)。 如果以上步骤无法解决(比如工具链中仍然有高版本符号),可能需要重新构建整个工具链,或者使用较老版本的交叉工具链。 另外,用户引用[2]中提到了复制宿主机的库到目标库路径,但这种方法并不安全,因为直接复制宿主机的库可能会引入不兼容问题。正确的方法还是使用目标系统对应的库。 注意:如果目标系统是嵌入式设备,可能没有完整的glibc,而是使用uclibc或其他C库,那么同样需要确保工具链与目标系统匹配。 如果问题依然存在,可以考虑静态链接glibc(但通常不推荐,因为glibc对静态链接支持不好)或者使用musl libc等替代方案。 相关问题: 1. 如何为嵌入式设备构建匹配glibc版本的交叉工具链? 2. 如何检查目标系统的glibc版本? 3. 如何在没有目标设备的情况下,获取目标系统的根文件系统? 4. 交叉编译Qt时如何避免依赖宿主机的高版本库? 5. 如何为Qt交叉编译指定特定的glibc版本?</think>### 解决 Qt 交叉编译错误 "GLIBC_2.34 not found" 的完整指南 #### 🔍 错误原因分析 当出现 `GLIBC_2.34 not found` 错误时,表明: 1. **工具链版本不匹配**:交叉编译工具链的 glibc 版本高于目标系统版本[^1] 2. **库依赖冲突**:编译时链接了宿主机的库而非目标系统库 3. **系统根目录未隔离**:未正确使用 `-sysroot` 隔离编译环境 --- ### 🛠️ 解决方法(分步操作) #### 步骤 1:验证目标系统 glibc 版本 在目标设备上执行: ```bash ldd --version # 输出示例:ldd (Ubuntu GLIBC 2.31-0ubuntu9.9) 2.31 ``` 记录最高支持的 glibc 版本(如 2.31) #### 步骤 2:检查工具链兼容性 在宿主机检查工具链的 glibc 要求: ```bash arm-linux-gcc -dumpspecs | grep -A1 link_libc # 或 strings /opt/EmbedSky/crosstools_3.4.5_softfloat/arm-linux/lib/libc.so.6 | grep GLIBC_ ``` #### 步骤 3:配置正确的 sysroot(关键步骤) 在 Qt 配置中添加目标系统根目录: ```bash ./configure \ -sysroot /path/to/target/rootfs \ # 目标系统根目录 -extprefix /opt/qt-cross-install \ # 安装路径 ... ``` **目录结构要求**: ``` /path/to/target/rootfs ├── lib # 包含目标系统的 libc.so.* ├── usr │ └── lib └── ... # 其他目标系统文件 ``` #### 步骤 4:强制使用目标系统库 在配置中添加库路径限制: ```bash ./configure \ -L/path/to/target/rootfs/usr/lib \ # 目标库路径 -I/path/to/target/rootfs/usr/include \ -nomake examples -nomake tools \ # 减少依赖 ... ``` #### 步骤 5:使用兼容工具链(示例) 参考引用[1][2]配置 ARM 工具链: ```bash ./configure \ -xplatform qws/linux-arm-g++ \ -embedded arm \ -qt-freetype \ -little-endian \ -qt-libjpeg -qt-zlib -qt-libpng \ # 使用内置库 -no-opengl -no-webkit \ # 禁用高依赖组件 -sysroot /opt/EmbedSky/rootfs # 目标系统根目录 ``` #### 步骤 6:编译后验证 检查生成的二进制文件依赖: ```bash arm-linux-readelf -d your_app | grep NEEDED # 应只显示目标系统支持的库版本 ``` --- ### ⚠️ 关键注意事项 1. **工具链选择原则**: ```mermaid graph LR A[目标系统glibc版本] --> B[选择工具链] B --> C{版本要求} C -- 目标=2.31 --> D[工具链≤2.31] C -- 目标=2.28 --> E[工具链≤2.28] ``` 2. **禁止宿主库污染**: ```bash # 错误做法:直接复制宿主库 cp -f /host/lib/*.so* target/lib/ # 会导致版本冲突[^2] # 正确做法:使用目标系统库 cp -f /path/to/target/rootfs/lib/*.so* target/lib/ ``` 3. **版本降级方案**: - 方案 1:使用 `crosstool-NG` 构建自定义工具链 - 方案 2:下载预编译的低版本工具链 - 方案 3:在容器中编译(如 Docker + Ubuntu 18.04) --- ### 🔧 错误排查清单 | 现象 | 解决方法 | |------|----------| | 编译通过,运行报错 | 检查 `ldd` 依赖链是否包含宿主库 | | 缺少低版本符号 | 在配置中添加 `-no-gcc-sysroot` | | 头文件不兼容 | 确保 `-I` 指向目标系统头文件目录 | | 链接器报未定义符号 | 使用 `-Wl,--rpath-link=/target/lib` | --- ### 📦 完整配置示例 ```bash ./configure -verbose \ -prefix /opt/qt-embedded \ -opensource -confirm-license \ -release -shared \ -embedded arm \ -xplatform qws/linux-arm-g++ \ -sysroot /opt/EmbedSky/rootfs \ # 目标系统根目录 -L /opt/EmbedSky/rootfs/usr/lib \ # 显式库路径 -I /opt/EmbedSky/rootfs/usr/include \ -qt-zlib -qt-libpng -qt-libjpeg \ # 使用内置库 -no-opengl -no-cups -no-glib \ # 禁用高依赖组件 -nomake examples -nomake tools \ # 减少编译内容 -qt-mouse-tslib \ # 输入设备支持 -I/usr/local/tslib/include \ # 外部库头文件 -L/usr/local/tslib/lib # 外部库路径 ``` --- ### 📚 补充建议 1. **使用 buildroot 构建环境**: ```bash make qmake_configure \ QT_CONFIG="static zlib png jpeg tslib" \ BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y ``` 2. **版本兼容性表**: | Qt 版本 | 推荐工具链 | 兼容 glibc | |---------|------------|------------| | Qt 5.15 | gcc 8.4 | ≤ 2.28 | | Qt 6.2 | gcc 9.3 | ≤ 2.31 | | Qt 6.5 | gcc 11.2 | ≤ 2.34 | 3. **调试技巧**: ```bash # 检查链接库来源 strace -f -e openat ./your_app 2>&1 | grep &#39;\.so&#39; # 查看符号版本 objdump -p libQtCore.so | grep -A50 &#39;Version References&#39; ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值