rk3568 , buildroot , qt ,使用sqlite, 动态库, 静态库
问题说明: 客户反馈 ,buildroot 系统 ,使用qt 使用sqlite ,有报错,无法使用sqlite.
测试情况说明: 我自己测试,发现, buildroot 自己默认就是 使能了 sqlite 的。
是否解决说明: 已解决
解决问题的逻辑:
1、首先在buildroot 中使能 sqlite3 , 看看使用命令行不行。
2、 然后写一个C语言看看,能不能使用 sqlite.
3 、然后就是 看看能不能在qt中使用C语言 操作 sqlite 。
4、 然后就是 使用 qt 的自带 的 sqlite 的库了。
方法依据:没有依据,就是测试,正好学习一下 sqlite
解决问题的过程:
疑问: 就是 普通的 sqlite 库 与 qt 自带的 sqlite 的库要怎么选择呢?
有什么区别呢?
疑问: 并且我发现, SDK 中编译好 buildroot 后, 在
rk356x_linux/buildroot/output/rockchip_rk3568/target/usr
目录下 是没有头文件的。
但是将系统烧写到 板卡之后,这个目录 又出现了。
这个问题先不管了。
先继续往下分析。
软件说明: 网盘上的 linux SDK
硬件说明: 核心板V1.1 +底板V1.7
流程开始:
先说一下我遇到的问题,首先 我是使用的是 3568 的SDK先编译一遍 buildroot 系统。
里面就编译了 sqlite3 的第三方包。
然后,我写了一个简短的 C的 对 sqlite 的测试程序。
代码如下:
1 #include <sqlite3.h>2 #include <stdio.h>3 #include <stdlib.h>456 int main(int argc, const char *argv[])7 {8 sqlite3 * dbSql;9 int ret;10 char * err;11 char ** dataSql;12 int n,m,i,j;13 char sql[50] = "select * from demo";14 if(0 != (ret = sqlite3_open("/root/demo.db",&dbSql))){15 printf("open db %s\n",sqlite3_errmsg(dbSql));16 exit(1);17 }18 if(0 != sqlite3_get_table(dbSql,sql,&dataSql,&n,&m,&err)){19 printf("get error: %s\n",err);20 }21 if(0 != n){22 for(i=0;i<n+1;i++){23 for(j=0;j<m;j++){24 printf("%s ",*dataSql);25 dataSql++;26 }27 printf("\n");28 }29 }else{30 printf("Empty!\n");31 }32 sqlite3_close(dbSql);33 return 0;34 }353637
~
我说交叉编译一下吧, 但是报错了。
我的编译命令是这个。
aarch64-linux-gnu-gcc -I /home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/ -L /home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs/ -o test_sqlite sqlite_test.c -lsqlite3
报错如下:
root@ubuntu:/home/topeet/source_code# aarch64-linux-gnu-gcc -I /home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/ -L /home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs/ -o test_sqlite sqlite_test.c -lsqlite3
/home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs//libsqlite3.so: undefined reference to `pthread_join@GLIBC_2.34'
/home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs//libsqlite3.so: undefined reference to `dlsym@GLIBC_2.34'
/home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs//libsqlite3.so: undefined reference to `pthread_mutex_trylock@GLIBC_2.34'
/home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs//libsqlite3.so: undefined reference to `dlclose@GLIBC_2.34'
/home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs//libsqlite3.so: undefined reference to `lstat64@GLIBC_2.33'
/home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs//libsqlite3.so: undefined reference to `fcntl64@GLIBC_2.28'
/home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs//libsqlite3.so: undefined reference to `pthread_mutexattr_destroy@GLIBC_2.34'
/home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs//libsqlite3.so: undefined reference to `pthread_mutexattr_settype@GLIBC_2.34'
/home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs//libsqlite3.so: undefined reference to `dlerror@GLIBC_2.34'
/home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs//libsqlite3.so: undefined reference to `fstat64@GLIBC_2.33'
/home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs//libsqlite3.so: undefined reference to `pthread_mutexattr_init@GLIBC_2.34'
/home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs//libsqlite3.so: undefined reference to `pthread_create@GLIBC_2.34'
/home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs//libsqlite3.so: undefined reference to `stat64@GLIBC_2.33'
/home/topeet/source_code/rk356x_linux/buildroot/output/rockchip_rk3568/build/sqlite-3210000/.libs//libsqlite3.so: undefined reference to `dlopen@GLIBC_2.34'
目前不知道 报错是什么原因引起的。
先放一放。
然后是我的解决方式。
我是这样解决的,首先我 我觉得 Buildroot 肯定下载了 关于sqlite 的 相关的源码包。
可以看到就是这个。 我手动解压了。
然后我手动编译了一下。
1099 ./configure --host=aarch64-linux-gnu --prefix=/home/topeet/source_code/sqlite_install1100 make1101 make install
然后 在编译 C的 sqlite 应用程序的时候,使用的这个命令。
这是我使用的编译命令。
1162 aarch64-linux-gnu-gcc -I /home/topeet/source_code/sqlite_install/include/ -L /home/topeet/source_code/sqlite_install/lib/ -o test_sqlite2 sqlite_test.c -lsqlite3
这是链接的动态库,能不能 使用静态库呢?
答案是不能的, 我在使用的时候出现这个问题。
编译命令:
root@ubuntu:/home/topeet/source_code# aarch64-linux-gnu-gcc -I /home/topeet/source_code/sqlite_install/include/ -L /home/topeet/source_code/sqlite_install/lib/ -o test_sqlite2 sqlite_test.c -lsqlite3 -static
报错如下:
root@ubuntu:/home/topeet/source_code# aarch64-linux-gnu-gcc -I /home/topeet/source_code/sqlite_install/include/ -L /home/topeet/source_code/sqlite_install/lib/ -o test_sqlite2 sqlite_test.c -lsqlite3 -static
/home/topeet/source_code/sqlite_install/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexLeave':
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:24104: undefined reference to `pthread_mutex_unlock'
/home/topeet/source_code/sqlite_install/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexTry':
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:24066: undefined reference to `pthread_mutex_trylock'
/home/topeet/source_code/sqlite_install/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexEnter':
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:24020: undefined reference to `pthread_mutex_lock'
/home/topeet/source_code/sqlite_install/lib//libsqlite3.a(sqlite3.o): In function `unixDlClose':
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:36586: undefined reference to `dlclose'
/home/topeet/source_code/sqlite_install/lib//libsqlite3.a(sqlite3.o): In function `unixDlSym':
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:36582: undefined reference to `dlsym'
/home/topeet/source_code/sqlite_install/lib//libsqlite3.a(sqlite3.o): In function `unixDlOpen':
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:36541: undefined reference to `dlopen'
/home/topeet/source_code/sqlite_install/lib//libsqlite3.a(sqlite3.o): In function `sqlite3ThreadCreate':
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:27396: undefined reference to `pthread_create'
/home/topeet/source_code/sqlite_install/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexFree':
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:23971: undefined reference to `pthread_mutex_destroy'
/home/topeet/source_code/sqlite_install/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexAlloc':
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:23927: undefined reference to `pthread_mutexattr_init'
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:23928: undefined reference to `pthread_mutexattr_settype'
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:23929: undefined reference to `pthread_mutex_init'
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:23930: undefined reference to `pthread_mutexattr_destroy'
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:23938: undefined reference to `pthread_mutex_init'
/home/topeet/source_code/sqlite_install/lib//libsqlite3.a(sqlite3.o): In function `sqlite3ThreadJoin':
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:27416: undefined reference to `pthread_join'
/home/topeet/source_code/sqlite_install/lib//libsqlite3.a(sqlite3.o): In function `unixDlError':
/home/topeet/source_code/rk356x_linux/buildroot/dl/sqlite-autoconf-3210000/sqlite3.c:36555: undefined reference to `dlerror'
先不管它。
我对 普通的C语言程序作了一个测试,
关于动态链接与静态连接是这样的。
但是为什么 第三方库 ,静态连接会出现问题,不清楚,先不管它。
然后是将编译好的 C语言的测试程序直接拷贝到开发板进行测试。
可以看到是可以的, 这里 测试程序我并没有 进行 关于头文件,以及 库文件的指定。
然后到这里 我觉的我有必要总结一下 关于 动态库,与静态库的东西。
代码:
头文件。
mylib.h
int Max(int a, int b);void PrintMaxNumber(int a, int b);
库文件。
mylib.c
#include <stdio.h>
int Max(int a, int b)
{return (a > b) ? a : b;
}void PrintMaxNumber(int a, int b)
{printf("The max is %d.\n", Max(a, b));
}
主文件代码
test.c
#include <stdio.h>
#include "mylib.h"int main()
{int a = 5;int b = 3;int max = Max(a, b);printf("The max number is %d.\n", max);PrintMaxNumber(a, b);return 0;
}
自己编写一个 静态库,
我自己的操作。
先编译成 .o
root@ubuntu:/home/topeet/source_code# aarch64-linux-gnu-gcc -c mylib.c -o mylib.o然后通过.o 生成 .a 文件。
root@ubuntu:/home/topeet/source_code# aarch64-linux-gnu-ar -rc libmylib.a mylib.oroot@ubuntu:/home/topeet/source_code# ls
libmylib.a mycode mylib.h rk356x_linux rk_android11.0_sdk sqlite_install test1 test.c
libsqlite3.a mylib.c mylib.o rk356x_linux_20231106.tar.gz rk_android11.0_sdk_full_20240918.tar.xz sqlite_test.c test2
主要是注意 使用的交叉编译器的命令。
自己编写一个动态库。
编译成 .o 文件
root@ubuntu:/home/topeet/source_code# aarch64-linux-gnu-gcc -c mylib.c -o mylib2.o -fPIC连接成 .so 文件
root@ubuntu:/home/topeet/source_code# aarch64-linux-gnu-gcc -o libmylib.so mylib2.o -shared
root@ubuntu:/home/topeet/source_code# ls
libmylib.a libsqlite3.a mylib2.o mylib.h rk356x_linux rk_android11.0_sdk sqlite_install test1 test.c
libmylib.so mycode mylib.c mylib.o rk356x_linux_20231106.tar.gz rk_android11.0_sdk_full_20240918.tar.xz sqlite_test.c test2
注意: 动态库与静态库 在链接时候的命令使用的是不一样的。
但是实际上是一样的,
比如我在编译静态库的时候, 使用的是 ar 命令,但是 如果你使用 gcc 的话,它会自动的使用 ar 命令去生成 静态库。
编译的时候,连接动态库。
编译的时候,连接静态库。
当静态库与动态库 在同一个目录下的时候, 它会优先选择动态库
然后在总结一下 , 交叉编译器的参数 。
总结:
1 -c 参数指定了 只是编译出.o 文件。
如果有-c 参数的话,就是 已经完成了 c--->汇编--->机器码的 过程,只是还没有 将.o 文件连接在一起, 而 没有-c 的话,就是 直接 将 .o 连接在一起了。
2 -o 参数 是在指定输出的名字, 可以与-c 一起使用,也可以单独使用。
3 -I (incldue) , 指的是 在搜索头文件的时候, 首先去 /usr/include 目录寻找,如果找不到的话,就去 自己指定的这个目录下寻找。
4 -L , 指的是 指定了库的路径,也是首先去默认的 /usr/lib 目录下寻找,如果找不到的话,就去 你指定的牧区去寻找。
5 -l (小写L) , 指的是 所连接的文件,既指 动态库,也指静态库, 这两个指定的方式上没有差别,都存在的话,优先选择动态库。
总结:
1 static 是在编译 应用的时候使用的,
2 shared 是在生成 动态库的时候使用的。
疑问: 那么交叉编译器使用的路径是什么呢? 肯定跟 系统本身的 gcc 使用的不是一个路径。
使用的测试命令是。
root@ubuntu:/home/topeet/source_code# echo 'main(){}'| aarch64-linux-gnu-gcc -E -v -
结果是。
root@ubuntu:/home/topeet/source_code# echo 'main(){}'| aarch64-linux-gnu-gcc -E -v -
使用内建 specs。
COLLECT_GCC=aarch64-linux-gnu-gcc
目标:aarch64-linux-gnu
配置为:'/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/snapshots/gcc.git~linaro-6.3-2017.05/configure' SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-shared --without-included-gettext --enable-nls --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --with-arch=armv8-a --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --enable-gnu-indirect-function --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/sysroots/aarch64-linux-gnu --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu/aarch64-linux-gnu/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=aarch64-linux-gnu --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu
线程模型:posix
gcc 版本 6.3.1 20170404 (Linaro GCC 6.3-2017.05)
COLLECT_GCC_OPTIONS='-E' '-v' '-march=armv8-a' '-mlittle-endian' '-mabi=lp64'/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../libexec/gcc/aarch64-linux-gnu/6.3.1/cc1 -E -quiet -v -imultiarch aarch64-linux-gnu -iprefix /home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/6.3.1/ -isysroot /home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../aarch64-linux-gnu/libc - -march=armv8-a -mlittle-endian -mabi=lp64
忽略重复的目录“/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/../../lib/gcc/aarch64-linux-gnu/6.3.1/include”
忽略不存在的目录“/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../aarch64-linux-gnu/libc/usr/local/include/aarch64-linux-gnu”
忽略不存在的目录“/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../aarch64-linux-gnu/libc/usr/local/include”
忽略重复的目录“/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/../../lib/gcc/aarch64-linux-gnu/6.3.1/include-fixed”
忽略重复的目录“/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/../../lib/gcc/aarch64-linux-gnu/6.3.1/../../../../aarch64-linux-gnu/include”
忽略不存在的目录“/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../aarch64-linux-gnu/libc/usr/include/aarch64-linux-gnu”
#include "..." 搜索从这里开始:
#include <...> 搜索从这里开始:/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/6.3.1/include/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/6.3.1/include-fixed/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/6.3.1/../../../../aarch64-linux-gnu/include/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../aarch64-linux-gnu/libc/usr/include
搜索列表结束。
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<命令行>"
# 31 "<命令行>"
# 1 "/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/include/stdc-predef.h" 1 3 4
# 32 "<命令行>" 2
# 1 "<stdin>"
main(){}
COMPILER_PATH=/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../libexec/gcc/aarch64-linux-gnu/6.3.1/:/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../libexec/gcc/aarch64-linux-gnu/:/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../libexec/gcc/:/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/6.3.1/../../../../aarch64-linux-gnu/bin/
LIBRARY_PATH=/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/6.3.1/:/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/:/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/:/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/6.3.1/../../../../aarch64-linux-gnu/lib/../lib64/:/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/6.3.1/../../../../aarch64-linux-gnu/lib/:/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../aarch64-linux-gnu/libc/lib/:/home/topeet/source_code/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/../aarch64-linux-gnu/libc/usr/lib/
COLLECT_GCC_OPTIONS='-E' '-v' '-march=armv8-a' '-mlittle-endian' '-mabi=lp64'
root@ubuntu:/home/topeet/source_code#
可以看到 这个 LIBRARY_PATH ,确实 不是 系统本身 的路径, 这个是 交叉编译器 压缩包本身的路径。
来分析一下 这个命令的含义。
echo 'main(){}'| aarch64-linux-gnu-gcc -E -v -
感觉像是写了一个 c 语言程序,交给 交叉编译器去测试了。
好了,到这里就总结完毕了。
参考资料:
基本上是一些个网上的资料。
Qt应用开发(3)——qt sqlite配置以及qt官方例程编译测试_buildroot编译qt的sqlite3-CSDN博客
嵌入式开发-linux根文件系统(一)sqlite_buildroot sqlite-CSDN博客
嵌入式开发-linux根文件系统(一)sqlite_buildroot sqlite-CSDN博客
《迅为 6818 使用手册》
相关文章:
rk3568 , buildroot , qt ,使用sqlite, 动态库, 静态库
问题说明: 客户反馈 ,buildroot 系统 ,使用qt 使用sqlite ,有报错,无法使用sqlite. 测试情况说明: 我自己测试,发现, buildroot 自己默认就是 使能了 sqlite 的。 是否解决说明&…...
web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理
web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理 1.uni.getSystemInfoSync().screenWidth; 获取屏幕宽度 2.uni.onWindowResize() 实时监测屏幕宽度变化 3.根据宽度的大小拿到每行要展示的数量itemsPerRow 4.为了确保样式能够根据 items…...
Airflow:TimeSensor感知时间条件
在数据管道工作流中,任务可能需要在特定的时间执行,或者在继续之前等待一定的时间。为了满足这些需求,Apache Airflow提供了TimeSensor,这是一种内置Sensor,可以监控当前时间,并在达到指定时间时触发后续任…...
使用Python和Neo4j驱动程序来实现小规模数据的CSV导入
要将CSV数据导入到Neo4j数据库中,你可以使用Neo4j提供的工具,比如neo4j-admin import命令(适用于大规模数据导入),或者使用Python的Neo4j驱动程序通过Cypher查询逐行插入数据(适用于小规模数据导入…...
网络安全测评技术与标准
网络安全测评概况 网络安全测评是网络信息系统和IT技术产品的安全质量保障。本节主要阐述网络安全测评的概念,给出网络安全测评的发展状况。 18.1.1 网络安全测评概念 网络安全测评是指参照一定的标准规范要求,通过一系列的技术和管理方法,获…...
某漫画网站JS逆向反混淆流程分析
文章目录 1. 写在前面1. 接口分析2. 反混淆分析 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Pyth…...
如何获取文件的MIME类型
文章目录 1. 概念介绍2. 方法与类型2.1 使用方法2.2 常见类型3. 示例代码4. 内容总结我们在上一章回中介绍了"如何加载本地图片"相关的内容,本章回中将介绍如何获取文件类型.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中提到的文件类型是指MI…...
Three.js 基础概念:构建3D世界的核心要素
文章目录 前言一、场景(Scene)二、相机(Camera)三、渲染器(Renderer)四、物体(Object)五、材质(Material)六、几何体(Geometry)七、光…...
Linux web服务器
Linux 作为 Web 服务器操作系统 安装 Web 服务器软件(以 Apache 为例) 步骤一:更新系统软件包列表 在 CentOS 系统中,使用命令 yum update -y 这个命令会连接到 CentOS 的软件包仓库,检查所有已安装软件包是否有更…...
Linux 下信号的保存和处理
信号的几个状态 信号抵达: 当接收到的信号被处理时, 此时就成为信号的抵达信号的未决: 从信号的产生到信号抵达这个时间段之间, 称为信号未决信号阻塞: 当进程设置了某个信号为阻塞后, 这个进程就不会在接收到这个信号信号忽略: 将信号设置为忽略后, 接收到这个信号, 对这个信…...
宝塔安装教程,bt怎么安装 linux
Centos安装脚本 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 37a09b35 Ubuntu/Deepin安装脚本 wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo b…...
java通过ocr实现识别pdf中的文字
需求:识别pdf文件中的中文 根据github项目mymonstercat 改造,先将pdf文件转为png文件存于临时文件夹,然后通过RapidOcr转为文字,最后删除临时文件夹 1、引入依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId&g…...
基于SpringBoot的养老院管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
阿里云发现后门webshell,怎么处理,怎么解决?
当收到如下阿里云通知邮件时,大部分管理员都会心里一惊吧!出现Webshell,大概是网站被入侵了。 尊敬的 xxxaliyun.com: 云盾云安全中心检测到您的服务器:47.108.x.xx(xx机)出现了紧急安全事件…...
韩顺平老师Linux学习笔记【持续更新...】
1、课程内容 1.1、课程大纲 1.2、Linux使用在哪些地方 Linux运维工程师Linux嵌入式工程师Linux下开发项目:JavaEE、大数据、Python、PHP、C/C、Go 1.3、Linux的应用领域 个人桌面领域服务器领域(最强领域)嵌入式领域 2、Linux入门 2.1、…...
Cognitive architecture 又是个什么东东?
自Langchain: https://blog.langchain.dev/what-is-a-cognitive-architecture/ https://en.wikipedia.org/wiki/Cognitive_architecture 定义 A cognitive architecture refers to both a theory about the structure of the human mind and to a computational…...
【css】浏览器强制设置元素状态(hover|focus……)
直接上步骤: 打开浏览器控制台 → 找到样式选项 → 找到:hov选项 → 点击:hov选项,会展开【设置元素状态】。 只要选中就会展示出自己写在css里面的该种状态下的样式了。...
leetcode热题100——NO.160相交链表——JAVA
一、题目描述 题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后,链表必…...
基于Media+Unity的手部位姿三维位姿估计
使用mediapipe Unity 手部位姿三维位姿估计 参考文章 基于Mediapipe的姿势识别并同步到Unity人体模型中 MediapipeUnity3d实现虚拟手_unity mediapipe-CSDN博客 需求 我的需求就是快速、准确的跟踪手部位姿并实现一个三维显示。 主要思路 搭建mdeiapipe系统,…...
cJson——序列化格式json和protobuf对比
cJson——序列化格式json和protobuf对比 1. 更小的消息体积2. 更快的序列化与反序列化速度3. 类型安全4. 向后和向前兼容性5. 更低的带宽消耗6. 高效的编码方式7. 易于跨语言支持8. 支持复杂的数据结构9. 更好的支持大型数据交换总结 Protocol Buffers (Protobuf) 和 JSON 都是…...
STM32F1学习——ADC模数转换器
一、ADC模数转换器 ADC的全称 Analog-Digital Converter 模拟-数字转换器,他可以用来将引脚上连续变换的模拟电压转换为内存中存储的数字变量。 ADC有两个重要指标,分辨率和频率。 STM32的ADC是 12位 逐次逼近型,1us转换时间,也就…...
2025-1-10-sklearn学习(36、37) 数据集转换-无监督降维+随机投影 沙上并禽池上暝。云破月来花弄影。
文章目录 sklearn学习(36、37) 数据集转换-无监督降维随机投影sklearn学习(36) 数据集转换-无监督降维36.1 PCA: 主成份分析36.2 随机投影36.3 特征聚集 sklearn学习(37) 数据集转换-随机投影37.1 Johnson-Lindenstrauss 辅助定理37.2 高斯随机投影37.3 稀疏随机矩阵 sklearn学…...
Linux之线程池与单例模式
目录 线程池 线程池代码 单例模式 饿汉模式单例模式 懒汉模式单例模式 在前几期,我们已经学习了多线程的创建和控制,学习了多线程中的同步和互斥,学习了多线程中的条件变量和信号量,基于此我们实现了基于阻塞队列和基于环形队…...
LabVIEW调用不定长数组 DLL数组
在使用 LabVIEW 调用 DLL 库函数时,如果函数中的结构体包含不定长数组,直接通过 调用库函数节点(Call Library Function Node) 调用通常会遇到问题。这是因为 LabVIEW 需要与 DLL 中的数据结构完全匹配,而包含不定长数…...
计算机的错误计算(二百零七)
摘要 利用两个数学大模型计算 arccot(0.125664e2)的值,结果保留16位有效数字。 实验表明,它们的输出中分别仅含有3位和1位正确数字。 例1. 计算 arccot(0.125664e2)的值,结果保留16位有效数字。 下面是与一个数学解题器的对话。 以上为与…...
基于 GEE 利用 RF 回归模型实现空间降尺度
目录 1 前言 2 完整代码 3 运行结果 1 前言 本篇讲述在GEE上基于回归模型降尺度,也就是要复现以下论文,该论文发表在J-Star期刊上。 “Ebrahimy H, Aghighi H, Azadbakht M, et al. Downscaling MODIS land surface temperature product using an a…...
Linux 系统下磁盘相关指令:df、du、fdisk、lsblk
文章目录 I df、du、fdisk、lsblk指令df命令用于显示文件系统的磁盘空间使用情况du命令用于估算目录或文件的磁盘空间使用情况fdisk命令用于对磁盘进行分区操作lsblk指令查看设备信息II 应用du估算目录或文件的磁盘空间使用情况lsblk查看服务器上查看硬盘个数III 知识扩展磁盘阵…...
在线或离线llama.cpp安装和模型启动
该版本安装时间是2025-01-10,因为不同版本可能安装上会有所不同,下面也会讲到。 先说下问题——按照官方文档找不到执行命令llama-cli或./llama-cli 先附上llama.cpp的github地址:https://github.com/ggerganov/llama.cpp,build…...
(Arxiv-2023)LORA-FA:针对大型语言模型微调的内存高效低秩自适应
LORA-FA:针对大型语言模型微调的内存高效低秩自适应 paper是香港浸会大学发表在Arxiv 2023的工作 paper title:LORA-FA: MEMORY-EFFICIENT LOW-RANK ADAPTATION FOR LARGE LANGUAGE MODELS FINE-TUNING ABSTRACT 低秩自适应 (LoRA) 方法可以大大减少微调…...
Ubuntu | 系统软件安装系列指导说明
文章目录 Ubuntu 系统软件安装系列指导说明工具系列1. Docker 与 Docker-Compose部署与安装 环境系列1. Golang部署与安装 数据库系列1. PostgreSQL17.2源码部署与安装 Ubuntu 系统软件安装系列指导说明 工具系列 1. Docker 与 Docker-Compose部署与安装 链接 环境系列 1…...
攻防靶场(32):两个爆破技巧 Funbox 7 EasyEnum
目录 攻击路径一 1. 侦查 1.1 收集目标网络信息:IP地址 1.2 主动扫描:扫描IP地址段 1.3 主动扫描:字典扫描 2. 初始访问 2.1 有效帐号:本地账户 3. 权限提升 3.1 滥用特权控制机制:Sudo和Sudo缓存 4. 凭据访问 4.1 凭据…...
Vue3初学之插槽(slot)使用
在 Vue 3 中,插槽(Slots)是一种强大的内容分发机制,允许你在组件中定义可替换的内容区域,从而使组件更加通用和灵活。以下是 Vue 3 中插槽的几种常见用法: 默认插槽 默认插槽是最基本的插槽类型࿰…...
从 0 开始上手 Solana 智能合约
Solana CLI 基础知识 Solana CLI 是一个命令行界面工具,提供了一系列用于与 Solana Cluster 交互的命令。 我们将介绍一些最常见的命令,但你始终可以通过运行 solana --help 查看所有可能的 Solana CLI 命令列表。 Solana CLI 配置 Solana CLI 存储了…...
USB基础 -- USB 控制传输(Control Transfer)的重传机制
USB 控制传输(Control Transfer)的重传机制 1. 控制传输的事务结构 控制传输分为三个阶段,每个阶段都有自己的事务,并可能触发重传机制: 设置阶段(Setup Stage):主机发送 8 字节的…...
创建基本的 Electron 应用项目的详细步骤
创建一个基本的 Electron 应用项目的详细步骤。我们将从安装 Node.js 开始,然后创建项目文件夹并初始化 Electron 项目。 1. 安装 Node.js 首先,确保你已经安装了 Node.js 和 npm。你可以在终端中运行以下命令来检查是否已经安装: node -v…...
《异步编程之美》— 全栈修仙《Java 8 CompletableFuture 对比 ES6 Promise 以及Spring @Async》
哈喽,大家好!在平常开发过程中会遇到许多意想不到的坑,本篇文章就记录在开发过程中遇到一些常见的问题,看了许多博主的异步编程,我只能说一言难尽。本文详细的讲解了异步编程之美,是不可多得的好文…...
Android 修改SVG属性并显示图片(AndroidSvg)
引入依赖: dependencies {implementation com.caverock:androidsvg-aar:1.4 }核心代码: import com.caverock.androidsvg.SVG import org.w3c.dom.Document import java.io.StringWriter import javax.xml.transform.OutputKeys import javax.xml.tran…...
Ubuntu 磁盘修复
Ubuntu 磁盘修复 在 ubuntu 文件系统变成只读模式,该处理呢? 文件系统内部的错误,如索引错误、元数据损坏等,也可能导致系统进入只读状态。磁盘坏道或硬件故障也可能引发文件系统只读的问题。/etc/fstab配置错误,可能…...
移动云自研云原生数据库入围国采!
近日,中央国家机关2024年度事务型数据库软件框架协议联合征集采购项目产品名单正式公布,移动云自主研发的云原生数据库产品顺利入围。这一成就不仅彰显了移动云在数据库领域深耕多年造就的领先技术优势,更标志着国家权威评审机构对移动云在数…...
Java一个简单的反弹动画练习
文章目录 说明代码详解创建窗体代码创建绘图板创建线程 运行结果完整代码 说明 做了一个小球和星型做反弹动画的窗体作为练习,分享给大家,为了方便和我一样的小白可以看的比较明白,所以尽量详细的标注了注释,希望能帮到同样在学习…...
互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅
本文将给出关于互联网架构演进的一个不同视角。回顾一下互联网的核心理论基础产生的背景: 左边是典型的集中控制通信网络,很容易被摧毁,而右边的网络则没有单点问题,换句话说它很难被全部摧毁,与此同时,分…...
git push命令
git push 常用命令 1. 拉取远程仓库最新数据 使用 git fetch git fetch作用: 获取远程仓库的最新数据(包括分支、标签等),但不会修改本地工作目录。 结果: 仅更新远程分支(如 origin/main)的…...
day01-HTML-CSS——基础标签样式表格标签表单标签
目录 此篇为简写笔记下端1-3为之前笔记(强迫症、保证文章连续性)完整版笔记代码模仿新浪新闻首页完成审核不通过发不出去HTMLCSS1 HTML1.1 介绍1.1.1 WebStrom中基本配置 1.2 快速入门1.3 基础标签1.3.1 标题标签1.3.2 hr标签1.3.3 字体标签1.3.4 换行标…...
软考信安16~网络安全风险评估技术原理与应用
1、网络安全风险评估概述 1.1、网络安全风险评估概念 网络安全风险评估(简称“网络风险评估")就是指依据有关信息安全技术和管理标准,对网络系统的保密性、完整性、可控性和可用性等安全属性进行科学评价的过程,评估内容涉及网络系统的脆弱性、网络安全威胁以及脆弱性被…...
嵌入式C语言:二维数组
目录 一、二维数组的定义 二、内存布局 2.1. 内存布局特点 2.2. 内存布局示例 2.2.1. 数组元素地址 2.2.2. 内存布局图(简化表示) 2.3. 初始化对内存布局的影响 三、访问二维数组元素 3.1. 常规下标访问方式 3.2. 通过指针访问 3.2.1. 指向数…...
计算机网络期末复习(知识点)
概念题 在实际复习之前,可以看一下这个视频将网络知识串一下,以便更好地复习:【你管这破玩意叫网络?】 网络规模的分类 PAN(个人区域网络):用于个人设备间的连接,如手机与蓝牙耳机…...
LeetCode:3298. 统计重新排列后包含另一个字符串的子字符串数目 II(滑动窗口 Java)
目录 3298. 统计重新排列后包含另一个字符串的子字符串数目 II 题目描述: 实现代码与解析: 滑动窗口 原理思路: 3298. 统计重新排列后包含另一个字符串的子字符串数目 II 题目描述: 给你两个字符串 word1 和 word2 。 如果…...
【SpringAOP】Spring AOP 底层逻辑:切点表达式与原理简明阐述
前言 🌟🌟本期讲解关于spring aop的切面表达式和自身实现原理介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 &am…...
es 3期 第23节-运用Pipeline实现二转聚合统计
#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性ÿ…...
T-SQL语言的编程范式
T-SQL编程范式探析 引言 随着信息技术的迅猛发展,数据库在各个行业的应用日益广泛。在众多数据库管理系统中,SQL Server以其高性能和易用性受到广泛欢迎。T-SQL(Transact-SQL)是SQL Server的扩展版本,是一种用于查询…...