CMake arm linux交叉编译CMakeLists.txt示例


set(tool_path /usr/local/arm/opt/EmbedSky/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf)

set(CMAKE_C_COMPILER ${tool_path}/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${tool_path}/bin/arm-linux-gnueabihf-g++)

set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_SYSTEM_NAME "Linux")
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_FIND_ROOT_PATH ${tool_path})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

#project
cmake_minimum_required(VERSION 2.6)
project(hello)

#var
set(target_name hello)
set(target_src )
set(lib_name src)
set(sub_src ./src)

#include
include_directories(${sub_src})

#src
aux_source_directory(. target_src)
add_subdirectory(${sub_src})


#bin
add_executable(${target_name} ${target_src})


#link
target_link_libraries(${target_name} ${lib_name})



 

这个脚本实现了使用arm-linux-gnueabihf-来编译一个hello.c的文件,最终生成的可执行文件也是hello,hello.c调用了./src文件夹下的一个foo.c里面的函数,这个函数的声明在foo.h,跟foo.c在同一个文件夹,这个模块生成的lib名字叫src,在连接hello的时候被调用

第1行 交叉编译器的路径是:/usr/local/arm/opt/EmbedSky/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf

第4,5行 指定编译器的可执行文件路径

第11行 指定查找库的路径

第28行 指定hello.c查找头文件的路径

第32行 包含子文件路径

第36行 指定生成可执行文件名hello

第40行 连接hello的时候依赖库libsrc

MuPDF 项目本身确实包含 `CMakeLists.txt` 文件,因此通常情况下并不需要手动创建。然而,如果用户从 GitHub 拉取的代码库中确实缺少该文件,则可能是由于分支选择错误或未完整下载源码导致的问题。若确认项目缺失 `CMakeLists.txt`,可以参考以下方法进行编译和构建。 ### 使用 Git 获取完整源码 首先确保使用 Git 克隆仓库时指定了正确的分支,并且完整获取了所有子模块。MuPDF 的官方仓库地址为:https://github.com/ArtifexSoftware/mupdf.git[^1]。克隆命令如下: ```bash git clone --recursive https://github.com/ArtifexSoftware/mupdf.git ``` 使用 `--recursive` 参数可确保所有依赖子模块也被正确拉取,其中可能包括必要的 `CMakeLists.txt` 文件。 ### 手动创建 CMakeLists.txt(适用于缺失情况) 如果确实发现项目缺少 `CMakeLists.txt`,可以手动创建以支持 CMake 构建系统。以下是一个基础的 `CMakeLists.txt` 示例,用于构建 MuPDF 可执行文件: ```cmake cmake_minimum_required(VERSION 3.25) project(mupdf) add_compile_options(-gdwarf-4) set(CMAKE_C_STANDARD 23) add_executable(${PROJECT_NAME} main.c) target_link_libraries(${PROJECT_NAME} mupdf mupdf-third freetype openjp2 jbig jbig2dec jpeg harfbuzz gumbo m z pthread iconv ) ``` 此配置假定所有依赖库已通过系统包管理器或本地构建安装完毕,并可通过链接器找到[^1]。 ### 使用 Makefile 进行编译(适用于非 CMake 构建环境) MuPDF 原生也支持基于 `Makefile` 的构建方式。在没有 `CMakeLists.txt` 的情况下,可以通过其自带的 `Makefile` 进行编译。进入项目根目录后,执行以下命令即可开始构建: ```bash make ``` MuPDF 的 `Makefile` 支持多种平台选项,例如指定目标架构、优化级别等。例如,为特定架构启用指令集优化,可以在 `Makefile` 中添加如下配置: ```makefile CFLAGS += -O2 -march=native ``` 此设置将启用 `-O2` 级别的优化并针对本地处理器架构生成代码[^2]。 ### 在 Windows 上使用 vcpkg 管理依赖项 对于 Windows 平台,建议使用 `vcpkg` 工具链来管理第三方依赖库。例如,安装 `freetype`、`openjp2` 等库,可以运行: ```bash vcpkg install freetype openjp2 jbig jbig2dec jpeg harfbuzz ``` 随后,在构建过程中通过 `-DCMAKE_TOOLCHAIN_FILE` 指定 `vcpkg` 的工具链文件,确保依赖项被正确识别和链接: ```bash cmake -DCMAKE_TOOLCHAIN_FILE=C:\code\vcpkg-2025.02.14\scripts\buildsystems\vcpkg.cmake .. ``` 此方式可有效避免因依赖项缺失或版本不匹配导致的编译失败问题[^3]。 ### 针对嵌入式设备(如 Arm IMX6ULL)的交叉编译 对于嵌入式设备上的部署,例如基于 Qt6 和 MuPDF 开发的 PDF 浏览器项目,需要配置交叉编译工具链。确保编译器、链接器路径以及目标平台参数均正确设置,并在 `CMakeLists.txt` 或 `Makefile` 中指定目标架构特性: ```cmake set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_C_COMPILER arm-linux-gnueabi-gcc) set(CMAKE_CXX_COMPILER arm-linux-gnueabi-g++) set(CMAKE_FIND_ROOT_PATH /opt/arm-linux-gnueabi) ``` 上述配置可用于为 Arm 架构的 IMX6ULL 开发板编译 MuPDF 应用程序,确保最终二进制文件能够在目标设备上正常运行[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值