【发布时间】:2018-10-08 14:16:50
【问题描述】:
我正在尝试使用 libfluid 编写我自己的 OpenFlow 控制器。但首先我想构建sample controller 来了解它是如何工作的。
编译示例控制器时出现以下错误:(这是我尝试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
在构建示例控制器之前,我按照steps 构建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 上构建它,看看它是否有效。
【问题讨论】:
-
grep -rn "event_base_del" YOUR_REPO并查看此方法的定义位置。然后验证您是否将代码与由符号组成的适当单元链接到该方法。 -
我尝试了这个命令并更新了我的帖子。它似乎链接到正确的库但仍然未定义的引用?