-
2021-05-09 00:03:31
查看全部文件(包含隐藏文件)
ls -all
查看全部文件 (不包含隐藏文件)
ls -ls
查看所有文件(可以看到具体大小,不包含隐藏文件)
ls -lh
上传文件 (centos的 )
需要先安装lrzsz( yum -y install lrzsz ) ,然后使用命令 rz
导出文件
sz 文件名
删除文件
rm -rf 文件名
清除命令行
clear
创建文件夹
mkdir 名称
下载文件
wget 链接地址
定义临时环境变量 ,只能在当前终端使用
export AAA =123456
使用临时变量
echo $AAA
定义全局变量
vim /etc/profile
i
export student = " Student is ok "
按esc 输入: wq
让定义生效 source /etc/profile
echo $student
权限说明
-rw-r--r-- 1 root root 6 Jun 1 22:55 test.txt
- 文件
d 代表文件夹 目录
-
rw- 1.当前自身所在用户的权限
r-- 2.代表同组的权限
r-- 3.其他用户的权限
r 可以读
w 可以写
x 可执行
chmod 777 test.txt 最高权限的配置
-rwxrwxrwx 1 root root 6 Jun 1 22:55 test.txt
chmod 477 test.txt
4 可读 2 可写 1可执行
chmod 111 test.txt
chmod +x test.txt 给三组都分配了,可执行权限
chmod u=r test.txt 当前所在用户 给一个 读的权限
chmod u=r,g=r,o=r test.txt 给三组都分配了读的权限
查看文件
cat 名称
VIM命令
一进入VIM编辑器的是,默认是命令模式
i 编辑的意思
a 追加的意思
:w 就是保存的意思
:q 退出的意思
:q! 强制退出,不管有没有保存
:set number 显示行号
:100 回到100行(不能使用小键盘,回到指定的行数)
命令模式下:
1.gg:跳转到最上面
2.G:跳转到最下面
3.k:上一行
4.j:下一行
5.h:左边, l:右边
注意点:1.不小心按到 Ctrl + S / Ctrl + 其他 会出现 死机的现象
2.不要操作小键盘
编译的原理
编译(把人写的代码,变成,机器可以认识的指令) Linux(gcc),Mac(Clang)
1.预处理阶段(include,宏 ....)
gcc -E Test.c -o Test.i
2.编译阶段,编译之后(汇编代码)
gcc -S Test.i -o Test.s
3.汇编处理阶段,把汇编代码处理成计算机认识的01010101机器码
gcc -c Test.s -o Test.o
4.链接阶段,打出可以执行的包
gcc -C Test.o -o Test 得到可执行的程序Test
执行程序Test
./Test
一条命令执行上面四个步骤: gcc Test.c -o Test
重命名
mv oldName newName
解压文件
unzip 文件名称 或者 tar xvf 名称
获取当前路径
pwd
交叉编译(linux 和 Android)生成可执行文件后,导入手机,建议放在手机的 /data/local/tmp/目录下,然后执行chmod 777 ,可以运行,否则需要手机完全root。
# 手机一般都是ARM的 ,模拟器是x86 或者x86_64的,这里是以手机为主的,选择toolchains下的arm
export NDK_GCC_arm_64="/root/xiachenhui/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc"
# --sysroot=路径(自动寻找头文件和库文件 .h/.so)
# -isystem 寻找指定目录的头文件)后面需要一个空格
# 如果同时设置--sysroot=路径 和 -isystem ,会用-isystem 的头文件覆盖--sysroot=的头文件,
#最终是使用--sysroot=的库文件, -isystem的头文件
# 以上配置,asm会无法引入,报错的原因是:C源码内部需要引入asm ,所以引入了第二个-isystem
export NDK_CFIG_arm_64="--sysroot=/root/xiachenhui/android-ndk-r17c/platforms/android-23/arch-arm -isystem /root/xiachenhui/android-ndk-r17c/sysroot/usr/include -isystem /root/xiachenhui/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"
# $NDK_GCC_arm_64 $NDK_CFIG_arm_64 -pie Test.c -o main_exe 生成可执行文件
交叉编译 (针对于32位的模拟器)
#模拟器的配置
export NDK_GCC_x86="/root/xiachenhui/android-ndk-r17c/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-gcc"
export NDK_CFIG_x86="--sysroot=/root/xiachenhui/android-ndk-r17c/platforms/android-23/arch-x86 -isystem /root/xiachenhui/android-ndk-r17c/sysroot/usr/include -isystem /root/xiachenhui/android-ndk-r17c/sysroot/usr/include/i686-linux-android"
查看手机的系统是64位还是32位的
先把 /system/bin/cat文件复制到sdcard: cp /system/bin/cat /sdcard/
然后把cat文件导出来:adb pull /sdcard/cat cat
再把文件导入linux系统,使用file cat查看系统版本
我的手机是:cat: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked (uses shared libs), BuildID[md5/uuid]=3e0d617626f422d39f014459076727db, stripped
如果有需求的话,mk编译器配置,把C打包成so库
app下的build里面添加配置
1.defaultConfig中添加
//闭包 指导编译方式的编译区域(armeabi-v7a , x86)
externalNativeBuild {
ndkBuild {
abiFilters "armeabi-v7a"
//这个可以不要,现在几乎没有x86的手机了。
abiFilters "x86"
}
/* cmake {
}*/
}
//指定打包的CPU架构模式
ndk{
abiFilters "armeabi-v7a"
abiFilters "x86"
}
2 android里面添加
//指定脚本路径 ,自己添加Android.mk文件
externalNativeBuild {
ndkBuild {
path 'src/Android.mk'
}
}
linux中普通编译静态库,add是自己写的C文件 main.c文件是自己写的C入口。
1. 先变成二进制文件: gcc -c add.c -o add.o
2. 打包成静态库 ar rcs -o libadd.a *.o
3 . 编译静态库 gcc main.c -o -L . -ladd
4. 运行main ./main
交叉编译打包静态库
1. 配置ar 变量 export NDK_AR_x86="/root/xiachenhui/android-ndk-r17c/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-ar
2. 交叉编译生成add.o文件 $NDK_GCC_x86 $NDK_CFIG_x86 -fPIC -c add.c -o add.o
3 .打包成静态库: $NDK_AR_x86 rcs -o libadd.a add.o
4. 这个导出来的.a才能在androidstudio使用
配置的变量
export NDK="/root/xiachenhui/android-ndk-r17c"
# 交叉编译
export NDK_GCC_x86="/root/xiachenhui/android-ndk-r17c/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-gcc"
export NDK_GCC_x64="/root/xiachenhui/android-ndk-r17c/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android-gcc"
export NDK_GCC_arm="/root/xiachenhui/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc"
export NDK_GCC_arm_64="/root/xiachenhui/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc"
export NDK_CFIG_x86="--sysroot=/root/xiachenhui/android-ndk-r17c/platforms/android-23/arch-x86 -isystem /root/xiachenhui/android-ndk-r17c/sysroot/usr/include -isystem /root/xiachenhui/android-ndk-r17c/sysroot/usr/include/i686-linux-android"
export NDK_CFIG_x64="--sysroot=/root/xiachenhui/android-ndk-r17c/platforms/android-23/arch-x86_64 -isystem /root/xiachenhui/android-ndk-r17c/sysroot/usr/include -isystem /root/xiachenhui/android-ndk-r17c/sysroot/usr/include/x86_64-linux-android"
export NDK_CFIG_arm="--sysroot=/root/xiachenhui/android-ndk-r17c/platforms/android-23/arch-arm -isystem /root/xiachenhui/android-ndk-r17c/sysroot/usr/include -isystem /root/xiachenhui/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"
export NDK_CFIG_arm_64="--sysroot=/root/xiachenhui/android-ndk-r17c/platforms/android-23/arch-arm64 -isystem /root/xiachenhui/android-ndk-r17c/sysroot/usr/include -isystem /root/xiachenhui/android-ndk-r17c/sysroot/usr/include/aarch64-linux-android"
export NDK_AR_x86="/root/xiachenhui/android-ndk-r17c/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-ar"
export NDK_AR_x64="/root/xiachenhui/android-ndk-r17c/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android-ar"
export NDK_AR_arm="/root/xiachenhui/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar"
export NDK_AR_arm_64="root/xiachenhui/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar"
- 交叉编译动态库
`
$NDK_GCC_x86 $NDK_CFIG_x86 -fPIC -shared add.c -o libadd.so
`
更多相关内容 -
CMAKE-DEMO:CMake 学习(cmake命令、测试、安装、打包、交叉编译、NDK、clang)
2021-05-16 19:50:58CMAKE-DEMO 这里应该不会在维护了,后续更新请移步: cmake 学习 生成工程 cmake -D[宏名称]=[宏值] -S [源码目录] -B [生成目录] -G [目标工程(Unix Makefiles...)] -A [附加选项(Win32/x64)] -T [工具集...编译 -
qt arm交叉编译命令
2021-05-14 01:36:26arm 版本配置命令#!/bin/sh../configure -prefix /home/mmm/dev/tools/qt_arm_5126 -verbose -opensource -release -confirm-license -xplatform linux-arm-gnueabihf-g++ -shared -qt-zlib -qt-libjpeg -qt-libpng ...arm 版本配置命令
#!/bin/sh
../configure -prefix /home/mmm/dev/tools/qt_arm_5126 -verbose -opensource -release -confirm-license -xplatform linux-arm-gnueabihf-g++ -shared -qt-zlib -qt-libjpeg -qt-libpng -make libs -linuxfb -eglfs -no-cups -no-iconv -no-pch -no-opengl -no-openssl
qmake 配置
#
# qmake configuration for building with arm-linux-gnueabihf-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = arm-linux-gnueabihf-gcc
QMAKE_CXX = arm-linux-gnueabihf-g++
QMAKE_LINK = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++
# modifications to linux.conf
QMAKE_AR = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy
QMAKE_NM = arm-linux-gnueabihf-nm -P
QMAKE_STRIP = arm-linux-gnueabihf-strip
load(qt_config)
aarch64 armv8版本配置编译命令
#!/bin/sh
../configure -recheck-all -release -extprefix /home/mmm/dev/tools/qt_aarch64_5126 -xplatform linux-aarch64-gnu-g++ -no-openssl -no-opengl -sysroot /home/mmm/dev/tools/3rd/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/sysroot-glibc-linaro-2.25-2019.02-aarch64-linux-gnu
楼兰公子
发布了124 篇原创文章 · 获赞 34 · 访问量 19万+
私信
关注
标签:gnueabihf,qt,++,QMAKE,编译,linux,arm
来源: https://blog.csdn.net/nh5431313/article/details/103940853
-
树莓派linux内核交叉编译shell脚本.zip
2019-08-22 20:29:24树莓派内核交叉编译脚本,ubuntu上运行,scp传到树莓派,运行pifuzhi.sh覆盖原来文件,树莓派B ver2测试通过,但免密码scp没有解决好,另外内核3.6版本没有dtb而是dts文件。 -
交叉编译Linux常用命令
2019-05-06 15:25:28嵌入式Linux不像ubuntu等系统安装命令很方便,常常需要去下载源码然后再交叉编译,一个两个还好,多了会很麻烦。有没有类似工具包这种的源码,一次编译皆大欢喜呢?当然是有的。 busybox中包含了大量的Linux常用...嵌入式Linux不像ubuntu等系统安装命令很方便,常常需要去下载源码然后再交叉编译,一个两个还好,多了会很麻烦。有没有类似工具包这种的源码,一次编译皆大欢喜呢?当然是有的。
busybox中包含了大量的Linux常用命令,官方说明:
Currently available applets include: [, [[, acpid, addgroup, adduser, adjtimex, ar, arp, arping, ash, awk, basename, beep, blkid, brctl, bunzip2, bzcat, bzip2, cal, cat, catv, chat, chattr, chgrp, chmod, chown, chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, cp, cpio, crond, crontab, cryptpw, cut, date, dc, dd, deallocvt, delgroup, deluser, depmod, devmem, df, dhcprelay, diff, dirname, dmesg, dnsd, dnsdomainname, dos2unix, dpkg, du, dumpkmap, dumpleases, echo, ed, egrep, eject, env, envdir, envuidgid, expand, expr, fakeidentd, false, fbset, fbsplash, fdflush, fdformat, fdisk, fgrep, find, findfs, flash_lock, flash_unlock, fold, free, freeramdisk, fsck, fsck.minix, fsync, ftpd, ftpget, ftpput, fuser, getopt, getty, grep, gunzip, gzip, hd, hdparm, head, hexdump, hostid, hostname, httpd, hush, hwclock, id, ifconfig, ifdown, ifenslave, ifplugd, ifup, inetd, init, inotifyd, insmod, install, ionice, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink, iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5, klogd, last, length, less, linux32, linux64, linuxrc, ln, loadfont, loadkmap, logger, login, logname, logread, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lzmacat, lzop, lzopcat, makemime, man, md5sum, mdev, mesg, microcom, mkdir, mkdosfs, mkfifo, mkfs.minix, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, modprobe, more, mount, mountpoint, mt, mv, nameif, nc, netstat, nice, nmeter, nohup, nslookup, od, openvt, passwd, patch, pgrep, pidof, ping, ping6, pipe_progress, pivot_root, pkill, popmaildir, printenv, printf, ps, pscan, pwd, raidautorun, rdate, rdev, readlink, readprofile, realpath, reformime, renice, reset, resize, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, run-parts, runlevel, runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, seq, setarch, setconsole, setfont, setkeycodes, setlogcons, setsid, setuidgid, sh, sha1sum, sha256sum, sha512sum, showkey, slattach, sleep, softlimit, sort, split, start-stop-daemon, stat, strings, stty, su, sulogin, sum, sv, svlogd, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar, taskset, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top, touch, tr, traceroute, true, tty, ttysize, udhcpc, udhcpd, udpsvd, umount, uname, uncompress, unexpand, uniq, unix2dos, unlzma, unlzop, unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, vlock, volname, watch, watchdog, wc, wget, which, who, whoami, xargs, yes, zcat, zcip
编译
1.下载:https://busybox.net/downloads/
2.解压:tar -jvxf busybox-1.25.1.tar.bz2
3.进到目录下执行:make menuconfig
4.Busybox Settings -> Build Options -> Cross Compiler prefix 输入交叉编译的工具链,比如我用的arm-none-linux-gnueabi-gcc,则填写arm-none-linux-gnueabi-
5.确定退出后开始编译:make
miscutils/nandwrite.c: In function 'nandwrite_main': miscutils/nandwrite.c:151:3: error: 'MTD_FILE_MODE_RAW' undeclared (first use in this function) miscutils/nandwrite.c:151:3: note: each undeclared identifier is reported only once for each function it appears in make[1]: *** [miscutils/nandwrite.o] Error 1 make: *** [miscutils] Error 2
将nandwrite.c:151行MTD_FILE_MODE_RAW改成MTD_MODE_RAW重新编译
util-linux/lib.a(nsenter.o): In function `nsenter_main': nsenter.c:(.text.nsenter_main+0x188): undefined reference to `setns' coreutils/lib.a(sync.o): In function `sync_main': sync.c:(.text.sync_main+0x7c): undefined reference to `syncfs' collect2: ld returned 1 exit status Note: if build needs additional libraries, put them in CONFIG_EXTRA_LDLIBS. Example: CONFIG_EXTRA_LDLIBS="pthread dl tirpc audit pam" make: *** [busybox_unstripped] Error 1
Coreutils -> sync 去掉(输入N去除,Y选中)
Linux System Utilities -> nsenter 去掉,重新编译
6.make install完成后,_install文件夹中就是编译好的命令了。
-
交叉编译总结
2021-05-14 13:20:46思考:对交叉编译不熟悉,一些事后感觉很简单的问题事前烦恼了很久。源代码的编译大致可以分为三个类,用cmake的,用make的, 用脚本的。用cmake的最好改,其次是用脚本的,一般文档写得全。用make的往往是很简陋的...思考:
对交叉编译不熟悉,一些事后感觉很简单的问题事前烦恼了很久。源代码的编译大致可以分为三个类,用cmake的,
用make的, 用脚本的。用cmake的最好改,其次是用脚本的,一般文档写得全。用make的往往是很简陋的,没文档,相关资料也少。
总结:
一.cartographer的Gmock GTest Glog模块的交叉编译
首先下载Gmock GTest Glog的源码,Gmock和GTest在github上的一个仓库中
修改cmakelist中修改
cmakelist中的设置
#告知当前使用的是交叉编译方式,必须配置
SET(CMAKE_SYSTEM_NAME Linux)
SET(TOOLCHAIN_DIR "/home/gzpeite/pettoolchain")
#指定编译工具,一定要设置
#或交叉编译器使用绝对地址
SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-gnueabi-gcc)
#指定C++交叉编译器
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-gnueabi-g++)
#不一定需要设置
#指定交叉编译环境安装目录...
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})
#从来不在指定目录下查找工具程序
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
#只在指定目录下查找库文件
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
#只在指定目录下查找头文件
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
二cartographer中的boost的iostream,首先在boost官网下载boost版本
我下的是boost_1.6的版本,不同的版本,流程不一样,
[http://www.boost.org](http://www.boost.org)
编译过程
1.首先运行boost解压目录下的
**./bootstrap.sh**
2.修改生成的**project-config.jam**文件
修改:
using gcc : arm : arm-none-linux-gnueabi-gcc ;
修改(这边不改也没事):
option.set prefix :(交叉编译器所在位置);
option.set exec-prefix :(交叉编译器所在位置)/bin ;
option.set libdir :(交叉编译器所在位置)/lib ;
option.set includedir :(交叉编译器所在位置)/include ;
如果编译boost时出现以下问题,按照如下流程可解决
看前面的 pkgconfig 。
就是他的东西。
pkgconfig 是一个命令程序,他通过一个通用的参数从 .pc 文件里面获取一些数据来帮助调用某个函数库的程序得到正确的编译参数。这是开发用的程序,如果你不需要开发编译程序。这部分都是 *-devel 包里面的数据。这些包卸载即可。
其实 pkg-config 就是个二传手而已。不过他提供了一个通用的参数获取方式,很多软件还是比较喜欢给他准备一个配置数据文件的。
网上给的建议
这是因为boost的iostream库依赖于zlib和bzip2,所以您应该首先安装zlib和bzip2,然后运行,这两个包佩特科技给的库里有,但是要正确的指定路径
tar --bzip2 -xf /path/to/boost_1_67_0.tar.bz2
./bootstrap.sh --prefix = path / to / installation / prefix
./b2
./b2安装
请参见页面中的【5.4如果发生构建错误】:[https]([https://www.boost.org/doc/libs/1_67_0/more/getting_started/unix-variants.html](https://www.boost.org/doc/libs/1_67_0/more/getting_started/unix-variants.html)) : //[www.boost.org/doc/libs/1_67_0/more/getting_started/unix-variants.html](http://www.boost.org/doc/libs/1_67_0/more/getting_started/unix-variants.html)[]([https://www.boost.org/doc/libs/1_67_0/more/getting_started/unix-variants.html](https://www.boost.org/doc/libs/1_67_0/more/getting_started/unix-variants.html))
请注意,当您运行./b2时,应该看到以下结果(没有这两个的boost的iostream,在cartographer中运行会报错):
* zib:是(已缓存)
* bzip2:是(已缓存)
通过,这样boost就能找到zlib,zlib好像又需要bzip2,通过下面这两个就将他们弄进boost_iostreams了,有zlib的iostreams是需要bzip2的
bzip2的的名字是bzlip2, 但是写路径要写bzip2,提示给我错误是bzlip2
这个有点坑,但是注意一点,找lib包的路径的名字和lib包的名字一定是相关的
./b2 -j8 --with-iostreams -s BZIP2_LIBRARY_PATH="/home/gzpeite/pettoolchain/lib" -s BZIP2_INCLUDE="/home/gzpeite/pettoolchain/include" -s ZLIB_LIBRARY_PATH="/home/gzpeite/gittestarm/boost_1_71_0/zlib/save/usr/local/lib" -s ZLIB_INCLUDE="/home/gzpeite/gittestarm/boost_1_71_0/zlib/save/usr/local/include"
3.测试编译效果
三,cartographer中的ceres的交叉编译
在github上下载ceres的2018年的版本,因为新的版本用些新的gcc的特性,导致gcc4.9编译的时候有些东西不识别,
ceres依赖suitesparse和tbb
tbb暂时没编译成功,但是不影响运行
suitessparse依赖于lapack,lapack依赖于blas
blas和lapack我们选择openblas, 它自带了blas和lapack,在github上找到openblas后git下来按照说明文档既可编译armv7下的程序,之后suitesparse和ceres中用到lapack和blas的时候,库的路径都选openblas.a就行
suitesparse的配置选项主要在suitesparse_configure文件夹下的suitesparse.mk中配置,我下载的suitesparse源码是4.0的,更改其中的cc和cxx的路径,具体还是参考虚拟机中的该文件吧,
如果找不到某个文件,可以试着在cxxflags中添加 -L./(path) -m -rt -rpath("path")
如果怎么写都找不到,那就将缺少的那个库编好后放到交叉编译工具文件夹下的所有lib中,也就三四个吧,保管就找的到了。
suitesparse就算编译成功了,其编出的库也可能是残缺的。我的经验是lapack blas libm.so librt.so 这4个库容易少,编译完最好往上拉一下。
四,在cartographer中的protobuf的交叉编译
在github上下载protobuf的3.6的版本,最新的3.10版本
一 、 protobuf 安装
下载链接
1\. 确认安装依赖库:automake ,autoconf ,libtool
2\. 下载 protobuf 安装文件,protobuf-cpp-3.6.0.tar.gz ,
解压,
第一次编译(获得protoc,根据proto文件生成.c和.h文件。编译在arm上执行的程序也是用这个x86上的protoc)
./autogen.sh
./configure
make
make check(报错,一般不用管)
sudo make install
然后进行第二次编译
先make clean
./configure --host=arm-linux CC=PATH/arm-none-linux-gnueabi-gcc CXX=PATH/arm-none-linux-gnueabi-g++ --disable-protoc --prefix=/usr/local/protobuf-c-arm
得到arm下的库
在make intall中指定安装路径 make install = DESTDIR
但是protoc要用第一次编译的,不要用第二次编译的。注意,不然在linux 编译protoc文件无法编译
五,cartographer下编译lua(注意,makefile文件有很多个,要选有下面这些选项的makefile)
在开发嵌入式项目时,由于嵌入式平台没有lua环境,只能自己移植。先到官网上下载最新的lua源码(点击打开链接)。
接下来按照下面步骤:
1、修改src/Makefile文件内容:
源码包中的原始的Makefile的部分需要更改的内容如下:
# Your platform. See PLATS for possible values.
PLAT= none
CC= gcc -std=gnu99
CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS)
LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS)
LIBS= -lm $(SYSLIBS) $(MYLIBS)
AR= ar rcu
RANLIB= ranlib
RM= rm -f
更改后的内容如下:
# Your platform. See PLATS for possible values.
PLAT= linux
CC=arm-oe-linux-gnueabi-gcc -std=gnu99 -march=armv7-a -mfloat-abi=softfp -mfpu=neon --sysroot=$(SDKTARGETSYSROOT)
CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS)
LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS)
LIBS= -lm $(SYSLIBS) $(MYLIBS)
AR= arm-oe-linux-gnueabi-ar rcu
RANLIB= arm-oe-linux-gnueabi-ranlib
RM= rm -f
SYSCFLAGS= -fexpensive-optimizations -frename-registers -fomit-frame-pointer -ftree-vectorize -Wno-error=maybe-uninitialized -finline-functions -finline-limit=64 -include quectel-features-config.h -fstack-protector-strong -pie -fpie -Wa,--noexecstack
SYSLDFLAGS= -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-z,relro,-z,now,-z,noexecstack
修改下面的内容;
linux:
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline"
为:
linux:
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl"
同时将luaconf.h文件的64行屏蔽。
2.修改顶层目录的Makefile文件
原始的文件部分内容如下:
# Your platform. See PLATS for possible values.
PLAT= none
# Where to install. The installation starts in the src and doc directories,
# so take care if INSTALL_TOP is not an absolute path. See the local target.
# You may want to make INSTALL_LMOD and INSTALL_CMOD consistent with
# LUA_ROOT, LUA_LDIR, and LUA_CDIR in luaconf.h.
INSTALL_TOP= /usr/local
修改后的内容如下:
# Your platform. See PLATS for possible values.
PLAT= linux
# Where to install. The installation starts in the src and doc directories,
# so take care if INSTALL_TOP is not an absolute path. See the local target.
# You may want to make INSTALL_LMOD and INSTALL_CMOD consistent with
# LUA_ROOT, LUA_LDIR, and LUA_CDIR in luaconf.h.
INSTALL_TOP= 自己想要安装的目录
保存,make,make install
上述只能产生lua的静态库。如果要产生动态库so,则按照下面步骤来:
1、在顶层的Makefile中的
TO_LIB= liblua.a
修改为
TO_LIB= liblua.a liblua.so
2、在/src/Makefile中的如下两行之间:
ALL_A= $(LUA_A)
# Targets start here.
添加如下选项
LUA_SO=liblua.so
ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO)
$(LUA_SO): $(CORE_O) $(LIB_O)
$(CC) -o $@ -shared -fPIC $? -ldl -lm
六,最后编译cartographer时注意事项
1,将根目录下的cmakelsit中test相关和main相关全部注释掉,这样就用不到gmock和gtest了,也少了一些错,编译起来速度也快些。
2,在FindXXX.cmake中通过set写绝对路径,具体参考虚拟机中的
3,如果少了什么库,但是你也编了,就通过target_linked_libraris来强制指定,写绝对路径,具体参考虚拟机中的。一般需要添加的都是suitesparse中的相关库,因为系统的FindCeres.cmake可能帮你去找了这些库
但是你自己写的FindCeres.cmake可能就没写这些,但是没关系,通过target_linked_liraries将suitesparse编译后产生的库都链接上,运行时,ceres就能找到了
七 一些有用的技巧
1 objdump -s --section=.comment xxx
可以看文件的编译器和含有什么库
2makefile中
修改cc和cxx的路径一般就是
CC= ..../arm-gcc
CXX= ..../arm-g++
添加动态库一般 -l(例如math库就是-lm pthread库就是-pthread) 通过-L./ 和rpath=("")来强制动态库的路径
写在CXXFLAGS CFLAGS
有的库要用到特殊的编辑器比如fortron啥的,路径就改为交叉编译工具中的arm-fortron路径
LIBS 用绝对路径来指定相应库
用warning 来打印消息
3在cmake中
用message来打印消息
通过cmakecache来查看你编译的这个库在编译时候产生了哪些变量,一般是路径相关的变量
4 undefined reference的错误一般就是找不到实现,找不到实现有两种情况,一是找不到库,二是找到的库里没有实现相因的函数。
库里没有相应函数的实现的原因有
库是残缺的,譬如编译的suitesparse库就会出现这种情况,选的blas不对,boost库编译没有配置zlib等。
库的版本不对应,譬如r16提供的gcc才4.9 比较落后,很多实现没有,所以用的ceres protobuf boost不能太新了,选2018及之前的。
5 unrecognaiz file 一般就是编译项目用的编译器 和 其依赖的库被编译时用的编译器 不一致产生的
-
交叉编译docker镜像
2021-08-05 14:54:58通过buildx可以使用Dockerfile构建多平台镜像; 但是针对java工程的maven Jib插件,可以直接使用其中高版本的实验功能“platforms”构建多平台镜像,不需要修改...可使用buildx验证或docker inspect查看镜像的编译平台 -
交叉编译环境介绍
2021-05-12 07:47:21交叉编译环境介绍交叉编译是嵌入式开发过程中的一项重要技术,它的主要特征是某机器中执行的程序代码不是在本机编译生成,而是由另一台机器编译生成,一般把前者称为目标机,后者称为主机。采用交叉编译的主要原因... -
mysql交叉编译方式
2021-01-04 20:21:41mysql 交叉编译的过程主要是通过 cmake 生成相应的配置文件与 Makefile,然后再执行 Makefile 脚本文件生成相应的目标文件。 -
tslib 交叉编译
2022-01-23 17:48:061:交叉编译 进入tslib 解压目录,执行 ./autogen.sh 来生成 Makefile 。需要在虚拟机中安装 autoconf、 automake、 libtool 工具。 执行 configure 脚本配置编译属性,我写的如下,仅供参考。 1 #!/bin/bash ... -
Linux树莓派开发——交叉编译概述和工具链的使用,文件的软/硬链接,以及带wiringPi库的交叉编译
2022-03-11 00:13:27Linux交叉编译的概述,教程工具链的安装和使用,以及带有wiringPi库的交叉编译。 -
[编译工具]rust交叉编译的使用方法
2019-04-28 09:32:00这时就需要用到交叉编译,把本地电脑的程序通过交叉编译环境编译成线上服务对应系统版本的可执行程序。 大致过程就是这样的 本地系统:mac系统 目标系统:centos(linux)系统 语言:rust 具体操作步骤如下 1)安装... -
【Android NDK 开发】NDK 交叉编译 ( NDK 函数库目录 | Linux 交叉编译环境搭建 | 指定头文件目录 | 指定...
2020-02-09 23:09:57I . NDK platforms 目录下的 函数库 II . Ubuntu 配置 NDK 交叉编译环境 III . 同时指定编译的头文件和库文件 IV . 指定编译的头文件 V . 指定编译的库文件 VI . 指定编译的头文件与库文件 示例 -
NTP服务交叉编译
2020-12-10 10:08:12输入命令:tar -cvf ntp-4.2.8p15.tar.gz 3.配置 进入解压目录下,更改config.sh配置文件 #!/bin/sh CC=/compiler/gcc-4.4.4-glibc/bin/arm-linux-gcc AR=/compiler/gcc-4.4.4-glibc/bin/arm-linux-ar A.. -
ARM端交叉编译python3.7及第三方库
2021-05-17 19:56:26在PC端交叉编译python 3.7及第三方库,并移植到ARM开发板上。 -
交叉编译 CURL
2022-03-24 15:50:51交叉编译 curl -
QNX 7.1 交叉编译 boost 1.76
2022-04-04 11:07:00在 QNX 7.1 环境下交叉编译 boost 1.76 版本 -
交叉编译环境搭建与测试
2021-01-23 14:24:18一、什么是交叉编译 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。 简单地说,就是在一个平台上生成另一个平台上的可... -
浅谈go语言交叉编译
2021-05-13 08:27:38再谈go语言交叉编译基础cgocgo设置编译和链接参数静态库和动态库静态库动态库静态编译交叉编译没有C代码,禁用CGO有C代码,启用CGO -XGOkaralabe/xgotechknowlogick/xgocrazy-max/xgo手动编译musl-crosstodo参考 ... -
iperf3 arm交叉编译补充
2020-05-10 20:32:59如果执行上面的命令没有权限,就使用chmod配置下,例如: 【chmod 777 $NDK/build/tools/make-standalone-toolchain.sh】 将目录及其子目录下的所有文件添加权限命令【chmod -R 777 *】 6、查看交叉编译环境是否OK,... -
交叉编译 Qt5.12.2
2019-03-17 10:06:31来自QQ群 Linux && 技术分享 311078264 打开链接加入QQ群:...k=5Gr3bAx 此文档由elikang整理,为了文章简单直接,许多细节未能在文章中体现,如有疑问请进群讨论。 ... 交叉编译工作在Ubuntu18.04上进行,... -
ubuntu常用库使用-交叉编译
2022-01-06 10:02:12Boost 查看版本号 参考链接 dpkg -S /usr/include/boost/version.hpp 交叉编译 参考链接 Bootstrap the build system: ./bootstrap.sh Modify the configuration file (project-config.jam) to use the ARM ... -
【Android NDK 开发】Ubuntu 函数库交叉编译 ( Android 动态库交叉编译 | Android 静态库交叉编译 )
2020-02-15 01:40:39I . Ubuntu 中交叉编译 Android 动态库 II . Ubuntu 中交叉编译 Android 静态库 -
树莓派交叉编译FFmpeg
2019-07-19 16:17:04前言:采用交叉编译的方式为树莓派安装ffmpeg程序,宿主机为Centos7,交叉编译工具链有buildroot编译完成,具体buildroot的编译请看我的其他文章。 1、编译x264库,注意打上使用汇编编译 tar -jxvf x264.tar.bz2 ... -
交叉编译工具链的安装及使用
2021-06-13 09:03:30交叉编译工具链的安装前言工具链的安装安装地址配置环境变量配置环境变量的作用 前言 在上文中讲了交叉编译工具链,现在再来安装交叉编译工具链,这个工具链是安装树莓派,由树莓派来使用的。 打比方说在使用Keil... -
X86_64 Ubuntu为树莓派zero(armv6)交叉编译tensorflow-lite
2021-03-14 22:23:221. 编译完成的效果 编译完成后,主要可以得到两个库和三个可执行文件: 如果需要编译自己写的模型代码成为可执行文件,可以看完本文后参考examples文件夹中的minimal示例: your/path/to/tensorflow-2.4.1/... -
gcc和交叉编译
2018-12-19 21:36:21通过交叉编译工具,我们就可以在CPU能力很强、存储空间足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。 --------------------- 作者:西子湖畔的蜗牛 来源:CSDN 原文:... -
protobuf-c之arm编译
2021-01-06 03:40:50编译前工作 ..../autogen.sh 生成configure文件。 在父目录创建构建目录,例如:/home/workspace/protobuf-c_build,通过终端进入构建目录,输入命令: ./../protobuf-c/configure \ -host=arm-linux \ -
Golang各个平台的交叉编译方式
2022-04-25 10:22:32总述:Golang 支持交叉编译,即在一个平台上生成另一个平台的可执行程序。 1、Mac 下编译 Linux 和 Windows 64位可执行程序 linux: 新建一个与main.go同层级的一个sh执行脚本,里面的内容如下: CGO_ENABLED=0... -
arm交叉编译详解
2016-11-03 14:38:35转载自 交叉编译详解–版本:v1.3.0, 有修改 CSDN GitHub arm交叉编译详解 AderXCoding/system/tools/cross_compile 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明...