【问题标题】:Clang error - fatal error: 'unistd.h' file not foundClang 错误 - 致命错误:未找到“unistd.h”文件
【发布时间】:2021-08-15 01:42:07
【问题描述】:

我已经安装了zlib-1.2.3.exe

我在 CLion 2020.1 中有以下设置:

我的CMakeLists.txt 文件中有以下几行:

cmake_minimum_required(VERSION 3.16)
project(ZLIB__test)

set(CMAKE_CXX_STANDARD 11)

set(ZLIB_LIBRARY "C:/Program Files (x86)/GnuWin32")
set(ZLIB_INCLUDE_DIR "C:/Program Files (x86)/GnuWin32/include")    
include_directories(${ZLIB_INCLUDE_DIR})    

add_executable(ZLIB__test main.cpp)

我在 main.cpp 中有以下源代码:

#include <cstdio>
#include <zlib.h>

// Demonstration of zlib utility functions
unsigned long file_size(char *filename) {
    FILE *pFile = fopen(filename, "rb");
    fseek(pFile, 0, SEEK_END);
    unsigned long size = ftell(pFile);
    fclose(pFile);
    return size;
}

int decompress_one_file(char *infilename, char *outfilename) {
    gzFile infile = gzopen(infilename, "rb");
    FILE *outfile = fopen(outfilename, "wb");
    if (!infile || !outfile) return -1;

    char buffer[128];
    int num_read = 0;
    while ((num_read = gzread(infile, buffer, sizeof(buffer))) > 0) {
        fwrite(buffer, 1, num_read, outfile);
    }

    gzclose(infile);
    fclose(outfile);
}

int compress_one_file(char *infilename, char *outfilename) {
    FILE *infile = fopen(infilename, "rb");
    gzFile outfile = gzopen(outfilename, "wb");
    if (!infile || !outfile) return -1;

    char inbuffer[128];
    int num_read = 0;
    unsigned long total_read = 0, total_wrote = 0;
    while ((num_read = fread(inbuffer, 1, sizeof(inbuffer), infile)) > 0) {
        total_read += num_read;
        gzwrite(outfile, inbuffer, num_read);
    }
    fclose(infile);
    gzclose(outfile);

    printf("Read %ld bytes, Wrote %ld bytes,Compression factor %4.2f%%\n",
           total_read, file_size(outfilename),
           (1.0 - file_size(outfilename) * 1.0 / total_read) * 100.0);
}


int main(int argc, char **argv) {
    compress_one_file(argv[1], argv[2]);
    decompress_one_file(argv[2], argv[3]);
}

并且,上面的源代码正在生成以下错误:

====================[ Clean | Debug ]===========================================
"C:\Program Files\JetBrains\CLion 2020.1.3\bin\cmake\win\bin\cmake.exe" --build C:\Users\pc\CLionProjects\ZLIB__test\cmake-build-debug --target clean

Clean finished

====================[ Build | all | Debug ]=====================================
"C:\Program Files\JetBrains\CLion 2020.1.3\bin\cmake\win\bin\cmake.exe" --build C:\Users\pc\CLionProjects\ZLIB__test\cmake-build-debug --target all
Scanning dependencies of target ZLIB__test
[ 50%] Building CXX object CMakeFiles/ZLIB__test.dir/main.cpp.obj
In file included from C:\Users\pc\CLionProjects\ZLIB__test\main.cpp:2:
In file included from C:\PROGRA~2\GnuWin32\include\zlib.h:34:
C:\PROGRA~2\GnuWin32\include/zconf.h(289,12): fatal error: 'unistd.h' file not found
#  include <unistd.h>    /* for SEEK_* and off_t */
           ^~~~~~~~~~
1 error generated.
NMAKE : fatal error U1077: 'C:\PROGRA~1\LLVM\bin\clang-cl.exe' : return code '0x1'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.

我该如何解决这个问题?

【问题讨论】:

    标签: c++ clang clion zlib gnuwin32


    【解决方案1】:

    CMake 中的一个重要经验法则是,如果您使用的是支持原生 CMake 的库,那么您应该使用 find_package() + target_link_libraries()add_subdirectory() + target_link_libraries()。手动添加标头搜索路径并链接到此类依赖项的库几乎总是错误的。

    以 CMake 方式做事通常会导致为合理制作的库(zlib 肯定是)正确配置。

    选项 A:find_package() + target_link_libraries()

    这需要将 zlib 安装在系统上可找到的位置。

    cmake_minimum_required(VERSION 3.16)
    project(ZLIB__test)
    
    set(CMAKE_CXX_STANDARD 11)
    
    find_package(zlib REQUIRED)
    
    add_executable(ZLIB__test main.cpp)
    target_link_libraries(ZLIB__test ZLIB::ZLIB)
    

    选项 B:add_subdirectory() + target_link_libraries()

    这里假设 zlib 的源代码副本位于相对于 CMakeLists.txt 的third_party/zlib

    cmake_minimum_required(VERSION 3.16)
    project(ZLIB__test)
    
    set(CMAKE_CXX_STANDARD 11)
    
    add_subdirectory("third_party/zlib")
    
    add_executable(ZLIB__test main.cpp)
    target_link_libraries(ZLIB__test ZLIB::ZLIB)
    

    【讨论】:

    • 我使用了第一个选项,出现如下错误:CMake Error at CMakeLists.txt:8 (add_executable): Target "ZLIB__test" links to target "ZLIB::ZLIB" but the target was not found. Perhaps a find_package() call is missing for an IMPORTED target, or an ALIAS target is missing?
    • 我已经修改了答案,将REQUIRED 添加到 find_package,这样您就可以更清楚地了解它无法找到 zlib。
    • 另外,你为什么跳过set(ZLIB_LIBRARY "C:/Program Files (x86)/GnuWin32")set(ZLIB_INCLUDE_DIR "C:/Program Files (x86)/GnuWin32/include")
    • 因为它是 find_package() 所做的工作,但以更清洁和更便携的方式。 zlib 是您系统的属性,而不是项目的属性。所以应该在调用cmake的时候,用cmake -DZLIB_ROOT=...,但是如果zlib确实安装在你的系统上,就会被找到。
    • 没有这两行,我的源代码无法编译。
    猜你喜欢
    • 1970-01-01
    • 2020-03-22
    • 2019-09-22
    • 2022-01-11
    • 1970-01-01
    • 2019-06-28
    • 2018-07-27
    • 1970-01-01
    相关资源
    最近更新 更多