编译OpenVAS源码时出现libgvm_util.so未定义MQTTClient相关符号的链接错误,求解决方案
解决OpenVAS编译时Paho MQTT符号未定义的问题
从你的报错信息和排查情况来看,问题的核心在于编译OpenVAS时,链接器无法正确找到并链接到你安装在/usr/local/lib的Paho MQTT C库——虽然你已经确认库文件和缺失的符号都存在,但CMake配置里并没有明确告诉链接器要使用这个库,或者链接器的搜索路径没包含/usr/local/lib。
下面是具体的解决思路和步骤:
1. 检查并修改CMakeLists.txt,明确链接Paho MQTT库
你的OpenVAS项目CMakeLists里没有任何针对Paho MQTT的查找或链接配置,这是导致链接失败的直接原因。你需要添加相关配置让CMake找到并链接该库:
方法1:使用find_package(推荐)
在主CMakeLists.txt的合适位置(比如add_subdirectory代码块之前)添加以下内容:
# 查找Paho MQTT的头文件和库文件 find_path(PAHO_MQTT_INCLUDE_DIR NAMES MQTTClient.h PATHS /usr/local/include) find_library(PAHO_MQTT_C_LIB NAMES paho-mqtt3c PATHS /usr/local/lib) # 确认找到库后,添加包含路径并为目标链接库 if(PAHO_MQTT_INCLUDE_DIR AND PAHO_MQTT_C_LIB) include_directories(${PAHO_MQTT_INCLUDE_DIR}) # 为报错的目标(openvas-nasl-lint)添加链接依赖 target_link_libraries(openvas-nasl-lint PRIVATE ${PAHO_MQTT_C_LIB}) # 同时记得给其他依赖libgvm_util的目标也添加该链接,比如src目录下的编译目标 else() message(FATAL_ERROR "Paho MQTT C library not found! Please check your installation.") endif()
方法2:手动指定链接库(快速测试)
如果find_package方式不好用,也可以直接在nasl目录下的CMakeLists中,为openvas-nasl-lint目标添加硬编码的库路径:
target_link_libraries(openvas-nasl-lint PRIVATE /usr/local/lib/libpaho-mqtt3c.so)
2. 确保链接器能搜索到/usr/local/lib路径
即使你指定了库,系统链接器默认可能不会搜索/usr/local/lib,可以通过以下方式解决:
临时方案(编译前设置环境变量)
在执行make前先运行以下命令:
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH export LIBRARY_PATH=/usr/local/lib:$LIBRARY_PATH
永久方案(修改CMake配置)
在主CMakeLists.txt中添加:
# 添加/usr/local/lib到链接器的搜索路径 link_directories(/usr/local/lib) # 配置程序安装后仍能找到该路径 set(CMAKE_INSTALL_RPATH "/usr/local/lib") set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
3. 重新执行CMake和编译
完成上述修改后,清理之前的编译缓存,重新配置并编译:
cd your-openvas-build-directory rm -rf CMakeCache.txt CMakeFiles/ cmake .. make
额外排查点
- 检查
libgvm_util.so的依赖:执行ldd /opt/gvm/lib/libgvm_util.so,查看它是否显示依赖libpaho-mqtt3c.so。如果没有,说明libgvm_util本身的编译也未链接Paho库,需要同步修改它的CMake配置。 - 确认Paho版本兼容性:虽然你已经用
nm确认符号存在,但可以检查OpenVAS文档中要求的Paho版本,确保你安装的版本符合要求。
内容的提问来源于stack exchange,提问作者bluesky
相关产品推荐
相关产品推荐

