新項目把libevent-2.1.11-stable移植到mt7620的Openwrt上,移植完編譯的時候遇到一個報錯
In file included from /usr/local/include/event.h:68:0,
from /home/project/base.cpp:26:
/usr/local/include/event2/event_struct.h:166:30: error: macro "LIST_HEAD" passed 2 arguments, but takes just 1
LIST_HEAD (event_dlist, event);
^
/usr/local/include/event2/event_struct.h:166:1: error: ‘LIST_HEAD’ does not name a type
LIST_HEAD (event_dlist, event);
搜了下有個哈皮的解決辦法竟然是把166行的LIST_HEAD (event_dlist, event);改爲 #define LIST_HEAD (event_dlist, event);
性質都不一樣了,明顯不靠譜。
搜了下頭文件 ,LIST_HEAD是在event_struct.h 99行定義的,
97 #ifndef LIST_HEAD
98 #define EVENT_DEFINED_LISTHEAD_
99 #define LIST_HEAD(name, type)
在Openwrt的交叉編譯工具鏈裏的list.h找到了同名的宏。
#define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name)
感覺有可能就是衝突了。把libevent裏相關的頭文件都搜了下,把 所有用到LIST_HEAD的全改成了LIST_HEAD_LIBEVENT。
問題解決。
存在問題:
搜了下文件,發現LIST_HEAD這個宏在交叉編譯成庫前也有event-internal.h以及bufferevent-internal.h裏也有用到。不過考慮到編譯的時候第一步預處理就是替換宏,理論上來說不影響。問題不大。