如何使用CMake构建QNX应用程序 解决qcc编译参数冲突报错问题
报错根因
你遇到的cc: Can't specify -P, -C, -E, -c or -S with -o and have multiple files报错,核心原因是工具链参数的配置顺序错误:project()命令执行时会立即触发编译器检测逻辑,你将CMAKE_C_COMPILER_TARGET、CMAKE_CXX_COMPILER_TARGET等交叉编译参数放在了project()之后,参数未生效,CMake会把架构标识误判为额外的输入源文件,导致编译命令里同时出现多个输入文件、-c编译参数、-o输出参数,不符合qcc/q++的语法规则。
修复方案
- 调整参数配置顺序:所有交叉编译相关的全局参数,必须放在
project()命令之前声明,确保编译器检测时参数已生效 - 启用
CMAKE_SYSROOT配置:QNX 7.1编译必须指定sysroot路径,编译前需先加载QNX SDK的环境脚本,确保QNX_TARGET环境变量正常生效 - 显式传递编译目标参数:避免CMake自动识别参数异常,直接在C/CXX编译参数中声明目标架构
修改后的完整CMakeLists.txt示例:
cmake_minimum_required(VERSION 3.14) # 所有交叉编译参数必须放在project命令之前 set(CMAKE_SYSTEM_NAME QNX) set(arch gcc_ntoaarch64le_gpp) set(ntoarch aarch64le) set(QNX_PROCESSOR aarch64le) set(CMAKE_C_COMPILER qcc) set(CMAKE_C_COMPILER_TARGET ${arch}) set(CMAKE_CXX_COMPILER q++) set(CMAKE_CXX_COMPILER_TARGET ${arch}) set(CMAKE_SYSROOT $ENV{QNX_TARGET}) # 显式指定编译目标参数,避免识别异常 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -V${arch}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -V${arch}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -V${arch}") project(test) add_executable(hello src/testhello.cpp)
操作验证步骤:
- 编译前先执行
source <你的QNX7.1 SDK安装路径>/qnxsdp-env.sh加载环境变量- 清空之前的构建缓存,删除build目录下所有生成文件
- 重新执行
cmake .. && make即可正常编译
内容的提问来源于stack exchange,提问作者Rigel Chen
相关产品推荐
相关产品推荐

