QT4.8.5移植到HI3516平台平台

本文详细介绍了在Ubuntu10.04 LTS环境下,使用GCC4.4.1和uClibc,从源码编译Qt4.8.5至PC端和ARM端的过程。包括解决配置错误、安装依赖库、设置交叉编译环境、编译及安装步骤,以及如何在QtCreator中配置交叉编译。

环境:UBUNTU 10.04LTS, GCC 4.4.1, uClibc, QT SDK 4.8.5

  1. 下载qt-everywhere-opensource-src-4.8.5.tar.gz, PC端和ARM端都是同一个文件,下载地址:http://download.qt-project.org/official_releases/qt/4.8/4.8.5/qt-everywhere-opensource-src-4.8.5.tar.gz

 

2、先编译PC端的,

1) 解压出来,重命名文件夹为: x86-qt-everywhere-opensource-src-4.8.5

2) 进入到x86-qt-everywhere-opensource-src-4.8.5目录

3) 配置:  ./configure

出现错误:

Basic XLib functionality test failed!

 You might need to modify the include and library search paths by editing

 QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in /home/cjh/qt/qt-everywhere-opensource-src-4.8.5/mkspecs/linux-g++.

安装libxtst-dev:apt-get install libxtst-dev

./configure

出现:Warning: -no-xrender will disable the QtWebkit module.

安装libxrender-dev:apt-get install libxrender-dev

./ configure

如需重新配置,To reconfigure, run 'make confclean' and 'configure'.

4) make,没出现什么问题,花了二三个小时完成。

5) sudo make install 默认装在:/usr/local/Trolltech/Qt-4.8.5

 

3、编译ARM端

1) 安装交叉编译器

    安装海思平台交叉编译器arm-hisiv100-linux

安装目录是/opt/hisi-linux/x86-arm/arm-hisiv100-linux

在/etc/profile文件中添加PATH

Export PATH="/opt/hisi-linux/x86-arm/arm-hisiv100-linux/target/bin:$PATH"  

确认编译器安装成功,arm-hisiv100-linux-gcc -v

    2) 从压缩包再解压出来,重命名文件夹为: arm-qt-everywhere-opensource-src-4.8.5。虽然与PC端是相同的代码,按理说在同一个文件夹用不同的配置也可以,但为了避免问题,还是另建一份新的档案。而且也可以同时make,节省时间。

3) 进入到arm-qt-everywhere-opensource-src-4.8.5目录

4) 设置交叉编译工具链,修改文件qmake.conf arm-qt-everywhere-opensource-src-4.8.5/mkspecs/linux-arm-gnueabi-g++ /qmake.conf,修改内容如下:  

# modifications to g++.conf

QMAKE_CC = arm-hisiv100-linux-gcc

QMAKE_CXX = arm-hisiv100-linux-g++

QMAKE_LINK = arm-hisiv100-linux-g++

QMAKE_LINK_SHLIB = arm-hisiv100-linux-g++

 

# modifications to linux.conf

QMAKE_AR = arm-hisiv100-linux-ar cqs

QMAKE_OBJCOPY = arm-hisiv100-linux-objcopy

QMAKE_STRIP = arm-hisiv100-linux-strip

 

    5) 配置:

./configure -opensource -embedded arm -host-little-endian -little-endian -static -no-cups -no-3dnow -no-script -no-webkit -no-javascript-jit -no-qt3support -nomake examples -nomake docs -xplatform /qws/mkspecs/linux-arm-gnueabi-g++

 

6) make ,耗时20-30分钟

出现错误:

qthread_unix.cpp:  undefined reference to `__tls_get_addr

修改src/corelib/thread目录下的qthread_unix.cpp文件, 关闭HAVE_TLS宏,再编译。

出现错误 

../3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp:662: error: 'pthread_getattr_np' was not declared in this scope

  pthread_getattr_np在uClibc中没有实现,不使用javascript, 暂时屏蔽了,如果用到javascript会有问题。

 

 

7) sudo make install, 安装在/usr/local/Trolltech/QtEmbedded-4.8.5-arm。如果需要安装在其他目录,./configure -prefix path指定

 

8) 修改环境变量,在~/.bashrc中添加以下语句

export ARMQTDIR=/usr/local/Trolltech/QtEmbedded-4.8.5-arm

export PATH=$ARMQTDIR/bin:$PATH

export LD_LIBRARY_PATH=$ARMQTDIR/lib

export QMAKESPEC=$ARMQTDIR /mkspecs/linux-arm-gnueabi-g++

重新加载~/.bashrc:

source ~/.bashrc

  检查是否成功:

      qmake -v

输出以下信息:

QMake version 2.01a

Using Qt version 4.8.5 in /usr/local/Trolltech/QtEmbedded-4.8.5-arm/lib

 

9) 例子程序测试

cd /examples/dialogs/standarddialogs

/usr/local/Trolltech/QtEmbedded-4.8.5-arm/bin/qmake -spec /usr/local/Trolltech/QtEmbedded-4.8.5-arm/mkspecs/linux-arm-gnueabi-g++/ -o Makefile standarddialogs.pro

make

arm-linux-strip standarddialogs

upx –qqq –v standarddialogs   //压缩

好了,standarddialogs可以放到目标板上去运行了。

4、安装Qt Creator

    qt-creator 2.8.1要求ubuntu 11.10 or later,所以装了2.7.2版本。

1) 运行安装程序 ./qt-creator-linux-x86-opensource-2.7.2.bin,按默认配置安装

2) 增加Compiler

指向交叉编译器的arm-hisiv100-linux-g++

QT4.8.5移植到HI3516平台

    3) 增加Qt versions,分别指向刚刚编译的二个平台的qmake

 

    4) 增加Kits

PC版本的

QT4.8.5移植到HI3516平台

 

ARM版本的

QT4.8.5移植到HI3516平台

<think>我们正在讨论Vue 3中的<script setup>语法。根据引用内容,我们可以总结出以下几点: 1. <script setup>是Vue 3中用于启用Composition API的一种语法糖,它简化了组件的编写,尤其是在逻辑组织和复用方面。 2. 在<script setup>中,可以直接使用Composition API的函数(如ref, onMounted等),而不需要显式地暴露变量或方法。 3. 由于<script setup>中没有this,因此访问路由等需要使用对应的Composition API函数(如useRouter)来获取。 4. 在<script setup>中,使用toRef和toRefs可以保持对响应式对象属性的响应式引用,即使解构也不会丢失响应性。 因此,我们可以围绕这些点来组织回答,包括: - <script setup>的作用 - 使用场景 - 基本用法 - 注意事项(如this的缺失、响应式处理等) 同时,我们也可以生成一些相关问题,以帮助用户进一步了解。</think>### Vue 3 `<script setup>` 详解 #### 一、核心作用 1. **简化组件逻辑** 通过自动暴露顶级变量和函数,无需手动 `return` 声明,减少模板代码量[^1]: ```vue <script setup> import { ref } from &#39;vue&#39; const count = ref(0) // 自动暴露给模板 </script> ``` 2. **增强 Composition API 支持** 直接使用响应式 API`ref`/`reactive`)和生命周期钩子,无需包裹在 `setup()` 函数中[^1]: ```vue <script setup> import { onMounted } from &#39;vue&#39; onMounted(() => console.log(&#39;组件已挂载&#39;)) </script> ``` 3. **消除 `this` 上下文** 强制使用 Composition API 替代 Options API,避免 `this` 指向问题[^2]: ```vue <script setup> import { useRouter } from &#39;vue-router&#39; const router = useRouter() // 替代 this.$router </script> ``` --- #### 二、关键特性 | 特性 | 说明 | 示例 | |------|------|------| | **自动响应式暴露** | 顶层变量自动成为模板可用数据 | `const msg = &#39;Hello&#39;` → 模板直接使用 `{{ msg }}` | | **顶级 `await` 支持** | 可直接在顶层使用异步操作 | `const data = await fetchData()` | | **组件自动注册** | 导入的组件可直接在模板使用 | `import MyComponent from &#39;./MyComponent.vue&#39;``<MyComponent/>` | | **Props/Emits 声明** | 通过 `defineProps``defineEmits` 编译器宏声明 | `const props = defineProps([&#39;title&#39;])` | --- #### 三、使用场景 1. **逻辑复用场景** 配合 `useXxx` 函数封装业务逻辑: ```vue <script setup> // 复用计数器逻辑 import { useCounter } from &#39;./counterLogic.js&#39; const { count, increment } = useCounter() </script> ``` 2. **路由控制** 访问路由对象(替代 `this.$router`)[^2]: ```vue <script setup> import { useRouter } from &#39;vue-router&#39; const router = useRouter() const navigate = () => router.push(&#39;/dashboard&#39;) </script> ``` 3. **响应式解构** 使用 `toRefs` 保持解构后数据的响应性[^3]: ```vue <script setup> import { toRefs } from &#39;vue&#39; const state = reactive({ user: &#39;Alice&#39;, age: 30 }) const { user, age } = toRefs(state) // 解构仍保持响应式 </script> ``` --- #### 四、与传统写法的对比 ```vue:line-numbers <!-- 传统 Options API --> <script> export default { setup() { const count = ref(0) return { count } } } </script> <!-- <script setup> 语法 --> <script setup> const count = ref(0) // 减少40%代码量 </script> ``` --- #### 五、注意事项 1. **避免直接解构 props** 错误做法:`const { title } = defineProps([&#39;title&#39;])`(丢失响应性) 正确做法:`const props = defineProps([&#39;title&#39;])` + `props.title` 2. **访问全局属性的替代方案** 使用 `inject` 替代 `this.$xxx````vue <script setup> import { inject } from &#39;vue&#39; const $api = inject(&#39;$api&#39;) // 替代 this.$api </script> ``` 3. **兼容性要求** 需配合 Vue 3.2+ 和 Vite/webpack 构建工具使用 > **最佳实践建议**:在大型项目中结合 TypeScript 使用,通过 `defineProps<{ title: string }>()` 获得类型检查支持[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值