0

我正在尝试使用 flymake 在 Emacs 中工作的 C++ 代码的语法突出显示。我知道使用 C++ 的标准 flymake 配置它会尝试运行make syntax-check,但是,我的构建系统不使用 Makefile(或至少不直接使用)。它使用rosmake,它是 ROS 系统的 cmake 包装器。

为了解决我无法控制 Makefile 的事实,我一直在尝试添加一个基于flymake 网站这个 stackoverflow question的自定义 flymake 检查器。

我已经创建了命令g++ -Wall -Wextra -fsyntax-only -Iinclude_dir file_to_check.cpp。当我在 bash 中运行命令时,我得到了预期的输出。没有语法错误,我有一个退出代码 0 并且没有输出。由于语法错误,我有一个退出代码 1 和按行列出的错误。但是,每当我尝试使用 flymake 运行它时,我都会得到一个 CFGERR 并被告知 flymake 已被禁用。

我很确定正在运行正确的命令,因为错误显示了完整的命令,并且一切看起来都与我在终端中键入的内容相同。我将日志记录级别一直提高到 3 以查看问题所在。日志中途出现错误

file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster.cpp, init=flymake-cc-init [3 times]
create-temp-inplace: file=/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster.cpp temp=/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster_flymake.cpp
saved buffer Broadcaster.cpp in file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster_flymake.cpp
started process 14517, command=(g++ -Wall -Wextra -fsyntax-only -std=c++0x  -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/include -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/msg_gen/cpp/include -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/srv_gen/cpp/include -I/opt/ros/fuerte/include
 Broadcaster_flymake.cpp), dir=/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/
received 40 byte(s) of output from process 14517
file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster.cpp, init=flymake-cc-init
parsed 'g++: error: : No such file or directory', no line-err-info
file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster.cpp, init=flymake-cc-init
process 14517 exited with code 1
cleaning up using flymake-simple-cleanup
deleted file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster_flymake.cpp
Broadcaster.cpp: 0 error(s), 0 warning(s), 0 info in 0.07 second(s)
switched OFF Flymake mode for buffer Broadcaster.cpp due to fatal status CFGERR, warning Configuration error has occured while running (g++ -Wall -Wextra -fsyntax-only -std=c++0x  -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/include -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/msg_gen/cpp/include -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/srv_gen/cpp/include -I/opt/ros/fuerte/include
 Broadcaster_flymake.cpp)

主要错误似乎是parsed 'g++: error: : No such file or directory', no line-err-info。我认为这可能是因为 Broadcaster_flymake.cpp 从未被创建,但我检查了它,它似乎正在工作。无论是否存在语法错误,我都会收到这些错误。我无法弄清楚为什么它找不到文件,因为将命令复制并粘贴到 Bash 中效果很好。我还尝试(shell-command "g++")在缓冲区中确保 emacs 正在找到 g++ 二进制文件,并且确实如此。

如果您知道为什么 flymake 无法运行命令,请告诉我。谢谢你。

4

1 回答 1

0

我弄清楚了问题所在。我重载了函数flymake-get-project-include-dirs。在那个函数中,我运行rospack cflags-only-I命令来获取当前 ROS 包的必要包含目录。我没有意识到的是,在我处理完 rospack 命令的输出后,最终的包含目录最后包含了一个换行符。当我看到它试图在缓冲区中运行的命令时,我注意到它试图检查的文件名总是在一个新行上,但我认为这只是一个格式化的东西。

现在我已经从我的包含目录中删除了所有换行符,一切都很好。

于 2013-04-02T05:18:27.973 回答