QuaZip 1.2调用QuaZipFile::open()添加文件到ZIP归档时出现未定义引用编译错误
看起来你遇到的是典型的链接器无法找到QuaZip库对应符号的问题——毕竟你能在头文件里看到open方法的声明,编译阶段顺利通过,但链接时失败了,这和语法、头文件引用无关,核心是你的项目没正确链接到QuaZip的二进制库文件。
我给你梳理几个最可能的解决方向,按优先级尝试:
1. 修正CMake的链接配置(最可能解决)
你当前的CMake里用了target_link_libraries(${EXECUTABLE_NAME} PRIVATE quazip1-qt5),但这个硬编码的库名可能和find_package(QuaZip5 REQUIRED)返回的正确配置不匹配。QuaZip 1.2针对Qt5的版本,在CMake中通常会提供标准的导入目标,建议修改成更可靠的写法:
find_package(QuaZip5 REQUIRED) # 使用find_package返回的官方导入目标,避免硬编码库名 target_link_libraries(${EXECUTABLE_NAME} PRIVATE QuaZip5::QuaZip) # 导入目标已经包含了头文件路径,这行可以保留但不是必须的 target_include_directories(${EXECUTABLE_NAME} PRIVATE ${QUAZIP_INCLUDE_DIRS})
如果你的系统上find_package(QuaZip5)没有生成导入目标,改用QUAZIP_LIBRARIES变量来链接:
find_package(QuaZip5 REQUIRED) target_link_libraries(${EXECUTABLE_NAME} PRIVATE ${QUAZIP_LIBRARIES}) target_include_directories(${EXECUTABLE_NAME} PRIVATE ${QUAZIP_INCLUDE_DIRS})
2. 验证头文件与库版本的一致性
有可能你的项目引用的头文件和链接的库不是同一版本:比如你include的是QuaZip 1.2的头文件,但链接到了另一个旧版本的QuaZip库。可以通过以下方式确认:
- 检查
QUAZIP_INCLUDE_DIRS指向的路径,是否是Rocky Linux 9中QuaZip 1.2的头文件目录(通常是/usr/include/quazip5) - 用
ldd命令检查最终生成的可执行文件(或链接时的临时文件),看它关联的QuaZip库版本:ldd your_executable | grep quazip,确认输出的是libquazip1-qt5.so.1(对应1.2版本)
3. 改用pkg-config获取准确的链接参数
如果find_package的方式不好用,试试用pkg-config直接获取QuaZip 5的链接和编译参数,这在Linux系统上往往更可靠:
修改CMakeLists.txt:
find_package(PkgConfig REQUIRED) pkg_check_modules(QUAZIP5 REQUIRED quazip5) target_link_libraries(${EXECUTABLE_NAME} PRIVATE ${QUAZIP5_LIBRARIES}) target_include_directories(${EXECUTABLE_NAME} PRIVATE ${QUAZIP5_INCLUDE_DIRS}) # 如果需要编译定义,也加上 target_compile_definitions(${EXECUTABLE_NAME} PRIVATE ${QUAZIP5_CFLAGS_OTHER})
小补充:代码里的路径细节(和当前错误无关,但WSL下要注意)
你代码里用了Windows风格的路径C:\\Users\\...,但你的环境是WSL2下的Rocky Linux 9,虽然WSL会自动挂载Windows盘到/mnt/c/,但直接用Windows路径在Linux程序里可能会有兼容性问题,建议改成WSL的路径格式,比如/mnt/c/Users/tyler.shellberg/Downloads/workingdir/materials.zip,避免潜在的路径解析问题。
内容来源于stack exchange

