cmake 交叉编译防坑指南
近来用cmake编译arm代码和第三方库遇到一些坑,在这里回顾一下,供大家借鉴。
cmake出现多层嵌套时的交叉编译指令
cmake -DMAKE_TOOLCHAIN_FILE=xxx.cmake .
xxx.cmake内需写明如下内容:
#告知当前使用的是交叉编译方式,必须配置
SET(CMAKE_SYSTEM_NAME Linux)
#指定C交叉编译器,必须配置
SET(CMAKE_C_COMPILER "/opt/arm-oe-linux-gnueabi/bin/arm-oe-linux-gnueabi/arm-oe-linux-gnueabi-gcc")
#指定C++交叉编译器
SET(CMAKE_CXX_COMPILER "/opt/arm-oe-linux-gnueabi/bin/arm-oe-linux-gnueabi/arm-oe-linux-gnueabi-g++")
#CMAKE_SYSROOT只有在3.0以上的版本才有效
SET(CMAKE_SYSROOT "/opt/arm-oe-linux-gnueabi/armv7")
#SET(MYSYSROOT "/opt/arm-oe-linux-gnueabi/armv7")
#SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE)
#SET(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE)
#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE)
#SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE)
#指定交叉编译环境安装目录...
SET(CMAKE_FIND_ROOT_PATH "/opt/arm-oe-linux-gnueabi/armv7")
#从来不在指定目录下查找工具程序
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
#只在指定目录下查找库文件
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
#只在指定目录下查找头文件
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
可能存在的坑:如果你在交叉编译之前已经生成了非交叉编译的临时文件,需要将其删除。
单独一个cmake时直接替换环境变量
CC=arm-oe-linux-gnueabi-gcc CFLAGS="$CFLAGS --sysroot=/tbox/gcc-eglibc-locale-internal-arm-oe-linux-gnueabi-4.9.2/armv7/" cmake -D CMAKE_INSTALL_PREFIX=${INSTALL_DIR} ../cmake
可能存在的坑:sysroot加到CFLAGS里而不是使用 –with-sysroot 参数,如果编译过程既使用CC又使用CXX,也需设置CXXFLAGS。
编译第三方库指定选择生产库的属性(shared staic)
CMakeList.txt中添加一行
SET(BUILD_SHARED_LIBS ON)