系统:ubuntu 12.04
1.安装交叉编译工具
$ sudo apt-get install g++-arm-linux-gnueabihf
2.配置makefile
新建一个目录build 用来编译,位置随意,我放在opencv源代码的根目录。
opencv采用cmake来配置,格式如下
cmake [<some optional parameters>] -DCMAKE_TOOLCHAIN_FILE=<path to the OpenCV source directory>/platforms/linux/arm-gnueabi.toolchain.cmake <path to the OpenCV source directory>
操作命令
$ cd build $ cmake -DENABLE_VFPV3=ON -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake .. $ make
参数解释:
ENABLE_VFPV3=ON 启用VFP
BUILD_SHARED_LIBS=OFF 关闭生成动态库,即生成静态库
ENABLE_NEON=ON 启用neon
SOFTFP=ON 启用softfp
参考:
Cross compilation for ARM based Linux systems
Linux 下编译安装OpenCV
3.使用静态库
写一个测试程序test.cpp,然后编写makefile,内容参考如下
CC = /usr/bin/arm-linux-gnueabihf-gcc #AR = /usr/bin/arm-linux-gnueabihf-ar CFLAGS += -I./include LDFLAGS = -lstdc++ -lrt -lpthread LDFLAGS += -L./libs/opencv -lopencv_core -lopencv_highgui -lopencv_imgproc -lm LDFLAGS += -L./libs/3rd -lzlib TARGET = test.exe #TARGET = libXXX.a (TARGET) : test.o $(CC) -o $(TARGET) $^ $(LDFLAGS) -static #$(AR) r $(TARGET) $^ test.o: test.cpp $(CC) -c $(CFLAGS) $^ clean : rm -rf test.o $(TARGET)
附:将静态库加上新文件打包成新的静态库
由于项目需求,要将别人提供的静态库加上新功能重新打包成静态库,网上找了很多资料,都说用
ar r new.a xxx.o old.a
就可以,但真正链接的时候,提示找不到old.a中的函数。用 ar t new.a 查看,old.a是作为一个整体打进了new.a。
解决方法,只能将新代码xxx.o追加到old.a中,命令如下
ar r old.a xxx.o
makefile编写参考文章:
跟我一起写 Makefile(一)
交叉编译用到的Makefile模板。
makefile 路径设置
Makefile编译目录下多个文件
Makefile 连接静态库注意事项
makefile 生成/使用静态库
gcc和g++的区别 →
makefile学习经验(一)----初涉makefile
makefile学习经验(二)----编译生成静态库文件
makefile学习经验(三)----编译生成动态库文件(方式一)
makefile学习经验(四)----编译生成动态库文件(方式二)
怎么编写Makefile生成静态库
编译链接出现的错误和解决:
← undefined reference to `std::ios_base::Init::Init() 解决
ARM compilation error, VPF registered used by executable, not object file
-mfloat-abi=softfp的问题,指定fpu为neon
交叉编译glibc相关
关于交叉编译glibc 2.11.1
文章有点过时,最新的glibc2.19,ports已经含在源码中了。