【问题标题】:Library compiled to architecture x64 with error in Arm architecture编译为架构 x64 的库在 Arm 架构中出现错误
【发布时间】:2017-09-17 10:07:47
【问题描述】:

我正在开发一个C++ 库,它有一段shell script 代码返回特定串行端口的名称。当我在控制台中运行此脚本时,无论是 X64 桌面还是 Arm 环境,脚本都会返回正确的答案。当我在库中执行相同的脚本时出现问题,返回显示格式错误的字符串,如 ÈÛT¶ÈÛT¶¨a ,但预期为 /dev/ttyACM0

在库内运行的脚本:

脚本

bash -c 'for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev);do(syspath="${sysdevpath%/dev}";devname="$(udevadm info -q name -p $syspath)";[[ "$devname" == "bus/"* ]]&& continue;teste="$(udevadm info -q property --export -p $syspath | grep -i "company_name")";if [[ !  -z "${teste// }" && $devname == *"ttyACM"* ]]; then echo "/dev/$devname";fi);done;' 2> /dev/null

以下代码用于将脚本返回的内容保存到文件中。

代码 c++

pfFile = fopen(CONFIG_FILE, "w+");
fwrite(result,strlen(result), 1, pfFile);
fclose(pfFile);
return 0;

【问题讨论】:

    标签: c++ linux utf-8 arm


    【解决方案1】:

    除了你没有在你的 C++ 代码中包含什么是结果以及它来自哪里;你选择了最困难的方法来做到这一点。在库中运行 shell 脚本的代码很可能只会让人头疼。

    基本上,您可以为您的设备创建一个udev 规则,以便在 /dev 中创建一个唯一且稳定的文件来访问它。您可以在 ArchWiki 中创建类似 this one 的文件

    KERNEL=="video[0-9]*", SUBSYSTEM=="video4linux", SUBSYSTEMS=="usb", ATTRS{idVendor}=="05a9", ATTRS{idProduct}=="4519", SYMLINK+="video-cam1"
    

    【讨论】:

    • 我无法在udev 中制定规则,因为这个库是为我们的客户使用的。
    • 所以,还有另一种方法。将脚本另存为可执行输出旁边的文件。使用/proc/self,您可以访问可执行文件的路径并在那里执行shell 脚本。您可以在 ssh 或串行控制台上检查 shell 脚本的输出以进行调试。甚至可以将其输出到文件中
    猜你喜欢
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多