我正在尝试使用libfluid来编写我自己的OpenFlow控制器。但首先,我想构建示例控制器以了解其工作原理。 编译示例控制器时出现以下错误:(这是我尝试make msg_controller
时遇到的错误(
c++ msg/MsgController.cc -lfluid_msg -lfluid_base -I. -O3 -std=c++0x -o msg_controller
/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libfluid_base.so: undefined reference to `event_base_del_virtual'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libfluid_base.so: undefined reference to `event_base_add_virtual'
collect2: error: ld returned 1 exit status
Makefile:10: recipe for target 'msg_controller' failed
make: *** [msg_controller] Error 1
在构建示例控制器之前,我按照步骤构建libfluid_base
和libfluid_msg
。在构建这两个库时,我收到以下提示,我认为这可能有助于解决我的问题
如果您碰巧想要链接到已安装的库 在给定的目录 LIBDIR 中,您必须使用 libtool,并且 指定库的完整路径名,或使用"-LLIBDIR" 标记,并至少执行以下操作之一:
- 将 LIBDIR 添加到"LD_LIBRARY_PATH"环境变量 执行期间
- 将 LIBDIR 添加到"LD_RUN_PATH"环境变量 链接期间
使用 '-Wl,-- rpath -Wl,LIBDIR' 链接器标志
- 让您的系统管理员将 LIBDIR 添加到 '/etc/ld.so.conf'
请参阅有关共享库的任何操作系统文档 更多信息,如 LD(1( 和 ld.so(8( 手册页。
未定义的引用错误是因为库未正确链接吗? 是否需要对 c++ 命令进行一些更改?
我尝试了命令grep -rn "event_base_del" /usr/lib
,也grep -rn "event_base_add" /usr/lib
event_base_del
的输出如下(event_base_add
相同(
Binary file /usr/lib/libfluid_base.a matches
Binary file /usr/lib/libfluid_base.so.0.0.0 matches
Binary file /usr/lib/x86_64-linux-gnu/libevent.a matches
Binary file /usr/lib/x86_64-linux-gnu/libevent-2.1.so.6.0.2 matches
Binary file /usr/lib/x86_64-linux-gnu/libevent_core.a matches
Binary file /usr/lib/x86_64-linux-gnu/libevent_core-2.1.so.6.0.2 matches
这是否意味着它链接正确? 因为libfluid_base.so
只是指向libfluid_base.so.0.0.0
的链接
lrwxrwxrwx 1 root root 22 Oct 8 09:36 libfluid_base.so -> libfluid_base.so.0.0.0
那么我该如何解决这个问题呢?
在我尝试使用 -levent_core 或 -levnet 让示例代码链接针对 libevent 之后。错误继续存在,可能是因为我现在使用的libevent版本与libfluid的当前版本不兼容。顺便说一下,我使用的是 Ubuntu18.04。
我将尝试使用旧版本的libevent在ubuntu16.04上构建它,看看它是否有效。
event_base_del_virtual
来自libevent库。将其与-levent_core
链接。