我试图用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)
可能缺少什么?提前致谢
看来这个旧帖子受到了很大的关注。将 zlib 与 CMake 链接的解决方案是:
下载 zlib(如果在 Linux 上)
sudo apt-get install zlib1g-dev
Run Code Online (Sandbox Code Playgroud)
然后遵循马蒂厄的建议。
或者像 1 中那样下载 zlib 并执行以下操作:
add_executable(my_executable main.cpp)
target_link_libraries(my_executable z)
Run Code Online (Sandbox Code Playgroud)
或者只需从其主页下载 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)
您必须链接到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)