You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派开机桌面自启脚本无法启动C无头应用,Shell运行正常

树莓派3B+开机自启C++无头应用失败问题

环境与配置

  • 硬件:树莓派3B+
  • 系统:Raspberry OS Buster
  • 自启配置:通过/etc/xdg/autostart/myScript.desktop实现桌面登录后自启,文件内容:
$ cat /etc/xdg/autostart/myScript.desktop
[Desktop Entry]
Type=Application
Name=Some Description
Exec=/opt/myDir/launchMyApp.sh
StartupNotify=true

权限配置:

$ ls -l /opt/myDir/launchMyApp.sh
-rwxr-xr-x 1 pi root 3373 Mar 13 16:29 /opt/myDir/launchMyApp.sh
$ ls -l /opt/ | grep myDir
rwxr-xr-x 4 pi   root 4096 Mar 13 16:29 myDir
$ ls -l /opt/myDir/myExec
-rwxrwxr-x 1 pi pi 71272 Mar 13 12:48 /opt/myDir/myExec

启动脚本/opt/myDir/launchMyApp.sh(简化版):

#!/usr/bin/env bash

ulimit -c unlimited    
LOG_FILE=/tmp/mylog.log
cd /opt/myDir || { printf "[err] unable to cd to /opt/myDir\n" >> ${LOG_FILE} 2>&1; exit 1; }
printf "[inf] log start: `date \"+%Y-%m-%d %H:%M:%S\"` at ${PWD} by `whoami`\n" > ${LOG_FILE} 2>&1
(./myExec 1 2 &)
(/usr/bin/chromium-browser --start-fullscreen http://1.2.3.4/whatever &)
exit 0

异常现象

  • 开机登录桌面后,chromium-browser可正常启动,但myExec完全无法运行
  • 脚本日志/tmp/mylog.log仅输出启动信息,无任何错误或运行日志:
$ cat /tmp/mylog.log
[inf] log start: 2023-03-13 16:38:50 at /opt/myDir by pi
  • myExec在pi用户手动登录Shell后可正常运行,但自启时即使在main函数开头添加日志代码也无日志生成,无core文件输出

排查尝试

  • 尝试多种启动方式:nohup ./myExec、(./myExec)、$(./myExec)、./myExec &等,均无效
  • 编写测试程序helloWorld,与myExec同目录、同权限、同编译器编译,可正常自启并生成日志:
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
    FILE* f = fopen("/opt/myDir/log/hello.log", "w");
    char params[16] = "";
    if(NULL != f) {
      snprintf(params, sizeof(params), "1[%s] 2[%s]\n", argv[1], argv[2]);
      fwrite(params, 1, sizeof(params), f);
      fclose(f);
    }
    return 0;
}
  • 将上述日志代码复制到myExec的main函数最开头重新编译,仍无日志生成
  • 创建会触发段错误的测试程序,添加ulimit -c unlimited后可正常生成core文件,但myExec依旧无任何输出
  • 通过file命令查看文件类型:
    • core、helloWorld、myExec均为:ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, ...
    • 其他正常可执行文件为:ELF 32-bit LSB executable, ARM, EABI5 version 1 ...

编译信息

主机为x86_64 Ubuntu Xenial,交叉编译命令如下:

编译阶段

/usr/bin/arm-linux-gnueabihf-g++ -std=c++11 -Wabi-tag -D_GLIBCXX_USE_CXX11_ABI=0 -DFLAG1 \
-DFLAG2 -fexceptions --sysroot=/opt/rpi/sysroot/bld  -Wno-deprecated  -Wno-format-truncation \
-Wno-unused-result  -O0 -g -DDEBUG -I/opt/dependencies/dependency01/dist/linux/armhf/include \
-I/opt/rpi/sysroot/bld/opt/vc/include \
-I/opt/rpi/sysroot/bld/usr/include/arm-linux-gnueabihf \
-I/opt/rpi/sysroot/bld/usr/include \
-I/opt/rpi/sysroot/bld/usr/local/include \
-c File.cpp -o obj/linux/armhf/debug/File.o

其中--sysroot指向挂载的Buster镜像

链接阶段

/usr/bin/arm-linux-gnueabihf-g++ -L/opt/rpi/sysroot/bld/opt/vc/lib \
-L/opt/rpi/sysroot/bld/usr/lib/arm-linux-gnueabihf \
-L/opt/rpi/sysroot/bld/usr/lib/gcc/arm-linux-gnueabihf/8 \
-L/opt/rpi/sysroot/bld/lib -L/opt/rpi/sysroot/bld/usr/lib \
-L/opt/dependencies/dependency01/dist/linux/armhf/dbg/lib \
-o dist/linux/armhf/dbg/myExec \
obj/linux/armhf/dbg/file1.o obj/linux/armhf/dbg/file2.o ... \
--sysroot=/opt/rpi/sysroot/bld -lextdep1 -lextdep2 -ldependency01

补充信息(编辑1)

  • 回滚到旧版本代码,使用Xenial x86_64的gcc 5.4.0交叉编译后,myExec可正常自启
  • 同一代码版本下,使用Fossa x86_64的gcc 9.4.0编译时:
    • 需添加-L$(CHROOT)/usr/lib/gcc/arm-linux-gnueabihf/8解决pow函数找不到的问题
    • 需添加-no-pie才能链接为可执行文件
    • 编译后的程序仍无法自启

内容的提问来源于stack exchange,提问作者vesperto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:37:08