2013-04-01 12 views
0

我想獲得使用flymake在Emacs中工作的C++代碼的語法高亮顯示。我知道,使用C++的標準flymake配置,它會嘗試運行make syntax-check,但是,我的編譯系統不使用Makefile(或至少不是直接)。它使用rosmake這是ROS系統的cmake封裝。Flymake CFGERR使用自定義的g ++命令

爲了解決我無法控制Makefile的問題,我一直試圖添加一個基於flymake websitethis 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無法運行該命令,請讓我知道。謝謝。

回答

0

我想出了問題所在。我超載了功能flymake-get-project-include-dirs。在那個函數中,我運行了rospack cflags-only-I命令來獲取當前ROS包的必要包含目錄。我沒有意識到最後的include目錄在結束處理rospack命令的輸出後在最後包含換行符。當我看到它試圖在緩衝區中運行的命令時,我注意到它試圖檢查的文件名總是在一個新的行,但我認爲這只是一個格式化的東西。

現在我已經從我的包含目錄中刪除了所有換行符,所有工作都很好。