io.h не найден CLion в Ubuntu 20.04

#c #linux #ubuntu #gcc #clion

#c #linux #ubuntu #gcc #clion

Вопрос:

Я пытаюсь запустить код на c , однако io.h не найден.

 'io.h' file not found
  

Он отображается как

 #include <io.h>
  

введите описание изображения здесь

Кроме того, я получаю кучу странных проблем (для кода, которому > 16 лет):

  Use of undeclared identifier '_read'
  

или

 Unknown type name '__int64'; did you mean '__int64_t'?
  

или

 Use of undeclared identifier '_O_RDONLY'
  

или

 Use of undeclared identifier '_lseeki64'; did you mean 'fseeko64'?
  

или

 Cannot initialize a parameter of type 'FILE *' (aka '_IO_FILE *') with an lvalue of type 'int'
  

или

 Use of undeclared identifier '_lseek'; did you mean 'fseek'?
  

или

 Use of undeclared identifier '_close'
  

Интересно, связаны ли они с тем, что io.h не найден.

 $ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.1 LTS
Release:    20.04
Codename:   focal
  

У меня есть CLion 2020.2.3
и

 $ gcc --version
gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  

Комментарии:

1. io.h откуда это? Это не стандартный заголовок. Может быть, это какая-то специфичная для Windows вещь?

2. Автор кода ссылается на стороннюю библиотеку. Вам нужно выяснить, что это за библиотека, и установить ее на свой компьютер.

3. поиск io.h в Google выдает множество ссылок, связанных с win32. Основываясь на сообщениях об ошибках, которые вы получаете, вы, вероятно, можете отказаться от своей зависимости от него и заменить его библиотекой файловой системы c 17

4. Спасибо, я думаю, вы имеете в виду, что io.h не является файлом, специфичным для ядра Windows или Linux, верно?

5. Это очень похоже на специфичную для Windows вещь.

Ответ №1:

Добавьте директивы компилятора для управления компиляцией нескольких ОС.

 //old line: #include<io.h>
#ifdef _WIN32
    #include <io.h>
#elif __linux__
    #include <inttypes.h>
    #include <unistd.h>
    #define __int64 int64_t
    #define _close close
    #define _read read
    #define _lseek64 lseek64
    #define _O_RDONLY O_RDONLY
    #define _open open
    #define _lseeki64 lseek64
    #define _lseek lseek
    #define stricmp strcasecmp
#endif
//SAF_Handle.cpp line:458 old line:INFILE = _open(infilename, _O_RDONLY | _O_BINARY);
#ifdef __linux__
  INFILE = _open(infilename, _O_RDONLY);
#elif
  INFILE = _open(infilename, _O_RDONLY | _O_BINARY);
#endif
  

Исправлено несколько циклов, в которых переменная итератора ‘i’ не была объявлена.