如何将Zlib与Cmake链接

AKJ*_*AKJ 4 c gzip zlib cmake

我试图用zlib libray链接我的文件,但仍然得到:对`deflateInit_'的未定义引用。

我当前正在使用CLion,已从主页下载zLib文件并将其添加到项目中。这就是我的CmakeLists.txt的样子

cmake_minimum_required(VERSION 3.10) project(GzipTest)

set(CMAKE_CXX_STANDARD 11)

include_directories(ZLIB zlib-1.2.11)

add_executable(GzipTest main.cpp zlib-1.2.11/zlib.h)
Run Code Online (Sandbox Code Playgroud)

和代码(从zpipe.c复制):

include "iostream"

include "zlib.h"

include "iostream"

define CHUNK 1639


FILE *fp;


int def(FILE *source, FILE *dest, int level){
    int ret, flush;
    unsigned have;
    z_stream strm;
    unsigned char in[CHUNK];
    unsigned char out[CHUNK];

    // Allocate Deflate state
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;

    ret = deflateInit(&strm, level);
    if (ret != Z_OK){
        return ret;
    }

}


int main(){
    fp = fopen("inputFile.txt", "r");
    if (fp == nullptr){
        perror("Could not open data");
        exit(EXIT_FAILURE);
    }
    def(fp, fp, 1); 
}
Run Code Online (Sandbox Code Playgroud)

可能缺少什么?提前致谢

AKJ*_*AKJ 7

看来这个旧帖子受到了很大的关注。将 zlib 与 CMake 链接的解决方案是:

  1. 下载 zlib(如果在 Linux 上)

     sudo apt-get install zlib1g-dev
    
    Run Code Online (Sandbox Code Playgroud)

    然后遵循马蒂厄的建议。

  2. 或者像 1 中那样下载 zlib 并执行以下操作:

     add_executable(my_executable main.cpp)
     target_link_libraries(my_executable z)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 或者只需从其主页下载 zlib: https: //zlib.net/,然后将其保存在“deps”文件夹中。修改zlib文件夹中的CMakeList为

     set(ZLIB_DEPS_DIR ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE)
    
    Run Code Online (Sandbox Code Playgroud)

    并在主 CMakeList 中执行

     add_executable(my_executable main.cpp)
     add_subdirectory(deps)
     include_directories(my_executable ${ZLIB_DEPS_DIR})
     target_link_libraries(my_executable zlib)
    
    Run Code Online (Sandbox Code Playgroud)


Mat*_*her 5

您必须链接到zlib。

如果您使用过:

find_package(ZLIB)
Run Code Online (Sandbox Code Playgroud)

然后,您应该具有:

target_link_libraries(GzipTest ${ZLIB_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

也不要将标头添加到您的源文件中:

add_executable(GzipTest main.cpp)
Run Code Online (Sandbox Code Playgroud)