【问题标题】:CMake build error: undefined reference to 'deflateEnd'CMake 构建错误:未定义对“deflateEnd”的引用
【发布时间】:2021-04-25 10:07:28
【问题描述】:

我正在尝试在我的项目中使用 zlib。 CMakeLists.txt 如下:

cmake_minimum_required(VERSION 3.5)

project(cmake-demo LANGUAGES CXX)
# The version number.
set(CMDemo_VERSION_MAJOR 0)
set(CMDemo_VERSION_MINOR 1)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(${PROJECT_SOURCE_DIR}/build/conan_paths.cmake)
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/build)
find_package(uwebsockets)

#ZLIB
if(ZLIB_FOUND)
  set(INC_DIRS ${INC_DIRS} ${ZLIB_INCLUDE_DIRS})
  set(LINK_LIBS ${LINK_LIBS} ${ZLIB_LIBS})
endif()

# Global approach
if(uwebsockets_FOUND)
  set(INC_DIRS ${INC_DIRS} ${uwebsockets_INCLUDE_DIRS})
  set(LINK_LIBS ${LINK_LIBS} ${uwebsockets_LIBS})
endif()

#libuv
if(libuv_FOUND)
  set(INC_DIRS ${INC_DIRS} ${libuv_INCLUDE_DIRS})
  set(LINK_LIBS ${LINK_LIBS} ${libuv_LIBS})
endif()

#usockets
if(usockets_FOUND)
  set(INC_DIRS ${INC_DIRS} ${usockets_INCLUDE_DIRS})
  set(LINK_LIBS ${LINK_LIBS} ${usockets_LIBS})
endif()

include_directories(${INC_DIRS})

add_executable(${PROJECT_NAME} main.cpp)
message("libs=${LINK_LIBS}")
target_link_libraries(${PROJECT_NAME} ${LINK_LIBS})

#output of message("${LINK_LIBS}")
C:/ProgramData/Miniconda3/Library/lib/z.lib;C:/Users/Sunway/.conan/data/libuv/1.41.0/_/_/package/9965605309592d7e617ec929633249a2031e4263/lib/libuv_a.a;C:/Users/Sunway/.conan/data/usockets/0.7.1/_/_/package/a24f5291464b4270092bce2e738cbf9f3cd53bb7/lib/libuSockets.a

我确定 ${LINK_LIBS} 是正确的,但它仍然不起作用:

CMakeFiles/cmake-demo.dir/main.cpp.obj: In function `ZN3uWS15DeflationStreamD1Ev':
C:/Users/Sunway/.conan/data/uwebsockets/19.2.0/_/_/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include/uWebSockets/PerMessageDeflate.h:186: undefined reference to `deflateEnd'

操作系统:Windows10 x64

IDE:QtCreator4.14.2

编译器:MinGW 32 位

【问题讨论】:

    标签: c++ cmake zlib conan


    【解决方案1】:

    问题是,您必须将库文件的路径设置为 target_link_libraries 参数。

    根据documentation,如果要链接库,target_link_libraries的每个参数可以是:

    • 库目标名称
    • 库文件的完整路径(例如/usr/lib/foo.so
    • 一个简单的库名称(例如foo

    在您的情况下,我建议您添加库的完整路径。

    我没有你项目的所有代码,所以我建议你考虑这个最小的例子:

    add_executable(test main.cpp)
    
    SET (ZLIB_ROOT "/tmp/zlib")
    SET (ZLIB_INCLUDE_DIR "/tmp/zlib/include/")
    SET (ZLIB_LIBRARY "/tmp/zlib/lib/libz.so.1.2.11")
    
    FIND_PACKAGE (ZLIB REQUIRED)
    MESSAGE (" zlib version major is " ${ZLIB_VERSION_MAJOR})
    MESSAGE (" zlib version minor is " ${ZLIB_VERSION_MINOR})
    MESSAGE (" zlib include is " ${ZLIB_INCLUDE_DIR})
    MESSAGE (" zlib libraries are " ${ZLIB_LIBRARIES})
    
    target_link_libraries(test ${ZLIB_LIBRARIES})
    

    下载latest zlib release并安装到/tmp后,一切正常。


    更新:正如@uilianries 提到的,由于您使用的是柯南,因此您拥有cmake_find_package 生成器,它定义了具有所有必要路径的变量。所以你不需要手动设置CMakeLists.txt中的路径。

    【讨论】:

    • 几乎正确。由于 SinoDawn 使用的是柯南,所以它也需要cmake_find_package 生成器。所以,不需要设置ZLIB_ROOT等等。
    • 是的,var 是柯南生成的。实际上,我使用的是依赖于 zlib 的 uwebsockets。完整的 CMakeLists 如下。我尝试了不同的方式来链接 zlib,但它不起作用。
    【解决方案2】:

    这是因为 libzlib.a 是针对 x86_64 而编译器是 MinGW-32bit;我通过执行命令解决了问题

    $conan install .. --build=missing --pr=x86_32
    

    x86_64 是由柯南生成的配置文件(x86)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      相关资源
      最近更新 更多