Консультация № 191273
09.08.2017, 17:54
0.00 руб.
0 11 1
Здравствуйте! Прошу помощи в следующем вопросе:

_mingw.h для Windows Visual Studio C++

Я пытаюсь перенести С++ код с Unix на Windows.
Но при выполнении debugging в Visual Studio C++ получаю сообщеения

\unistd.h(28): warning C4068: unknown pragma
\unistd.h(29): fatal error C1083: Cannot open include file:'_mingw.h_mingw.h': No such file or directory

Я не смог найти в Интернете версии _mingw.h совместимой с Visual Studio C++
При использовании имеющихся получаю сообщения

\_mingw.h(54): fatal error C1189: #error: ERROR: You must use a GNU Compiler

Каким образом возможно решить эту проблему?

Искренне Ваш, Анатолий (pesadelo)



Приложение:
/**
* @file unistd.h
* Copyright 2012, 2013 MinGW.org project
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef _UNISTD_H
#define _UNISTD_H
#pragma GCC system_header
#include <_mingw.h>

/*
* unistd.h maps (roughly) to io.h
* Other headers included by unistd.h may be selectively processed;
* __UNISTD_H_SOURCED__ enables such selective processing.
*/
#define __UNISTD_H_SOURCED__ 1

#include <io.h>
#include <process.h>
#include <getopt.h>

/* These are also defined in stdio.h. */
#ifndef SEEK_SET
#define SEEK_SET 0
#endif

#ifndef SEEK_CUR
#define SEEK_CUR 1
#endif

#ifndef SEEK_END
#define SEEK_END 2
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if !defined __NO_ISOCEXT
#include <sys/types.h> /* For useconds_t. */

int __cdecl __MINGW_NOTHROW usleep(useconds_t useconds);
#endif /* Not __NO_ISOCEXT */

/* This is defined as a real library function to allow autoconf
to verify its existence. */
int ftruncate(int, off_t);
#ifndef __NO_INLINE__
__CRT_INLINE int ftruncate(int __fd, off_t __length)
{
return _chsize (__fd, __length);
}
#endif

#ifdef __cplusplus
}
#endif

#undef __UNISTD_H_SOURCED__
#endif /* _UNISTD_H */

Обсуждение

давно
Посетитель
401264
3
10.08.2017, 13:32
общий

Я покопался и обнаружил, что использовал версию unistd.h для Unix. В ней имеется вызов _mingw.h.
В версии unistd.h для Windows вызова _mingw.h нет. Но при этом возникает другая ошибка.

\unistd.h(50): error C2371: 'int8_t': redefinition; different basic types
c:\program files (x86)\microsoft visual studio 14.0\vc\include\stdint.h(17): note: see declaration of 'int8_t'

unistd.h для Windows прилагается
Прикрепленные файлы:
829140e726b50ecd9ddb2ff66f3528af.txt
давно
Советник
400484
472
10.08.2017, 14:03
общий
Добрый день.
В ошибке говорится, что не может создать базовый тип 'int8_t'. Скорее всего, он уже описан в файле c:\program files (x86)\microsoft visual studio 14.0\vc\include\stdint.h. Проверьте это. Если это так, просто закомментируйте часть кода относящегося к объявлению базовых типов в приложенном файле...
давно
Посетитель
401264
3
10.08.2017, 18:01
общий
Адресаты:
В этом случае появляются сообщения подобного содержания:

1>MyFIle.obj : error LNK2001: unresolved external symbol "public: virtual class G4Run * __thiscall G4UserRunAction::GenerateRun(void)" (?GenerateRun@G4UserRunAction@@UAEPAVG4Run@@XZ)

Может ли это быть связано с несоответствием типа?
давно
Мастер-Эксперт
425
4118
10.08.2017, 18:27
общий
Адресаты:
А Вы не хотите вместо VSC++ применить GCC (mingw или cygwin). GCC более соответствует заголовочным файлам для unix, что наверняка поспособствует переводу.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
401264
3
10.08.2017, 18:36
общий
Адресаты:
У меня уже была эта идея.
Вы считаете, что с VSC++ не получится?
давно
Мастер-Эксперт
425
4118
11.08.2017, 06:26
общий
Адресаты:
Цитата: pesadelo
Вы считаете, что с VSC++ не получится?

Не могу Вам сказать точно, т.к. я с ним не работаю. Просто GCC делается один и тот же (ну почти ) под все поддерживаемые платформы (конечно мы не будем брать ОС-специфические функции), поэтому с ним потребуется меньше нервотрёпки при переводе программы с одной ОС на другую.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Советник
400484
472
11.08.2017, 09:36
общий
11.08.2017, 09:37
Цитата: pesadelo

solowey:
В этом случае появляются сообщения подобного содержания:

1>MyFIle.obj : error LNK2001: unresolved external symbol "public: virtual class G4Run * __thiscall G4UserRunAction::GenerateRun(void)" (?GenerateRun@G4UserRunAction@@UAEPAVG4Run@@XZ)

Может ли это быть связано с несоответствием типа?

У меня случалось подобное... Это было не связано с библиотеками или типами. Скорее всего вы не использовали extern при определении. Советую почитать тут - MSDN.
давно
Советник
400484
472
11.08.2017, 09:49
общий
14.08.2017, 13:03
Хотя, в предыдущем комментарии есть неточность. Это не связано с базовыми типами (типа int, short и т.п.). Class - это создаваемый тип пользователем. В этом случаи, тут имеет место ошибка связанная с типом.
У вас заголовочный файл, скорее всего, включен в несколько других файлов и при компиляции он добавляется в них. Линковщик видит один и тот же class в разных obj-файлах и не знает, что делать. Он не может собрать их в один, т.к. не знает какой использовать. По этому и возникают ошибки...
Настроив проект или использовав extern вы говорите линковщику использовать class только один раз, при первом упоминании (если не ошибаюсь). Конфликт ликвидируется...
Ну что-то в этом духе...
давно
Старший Модератор
17042
808
14.08.2017, 12:16
общий
Адресаты:
Оформите ответ?
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Советник
400484
472
14.08.2017, 13:06
общий
Адресаты:
Я не понимаю, помогли ли мои ответы, т.к. автор вопроса ни чего не написал. Может так ни чего и не получилось...
Если не ответит до завтра, придется отписать общие фразы...
давно
Советник
400484
472
16.08.2017, 10:41
общий
это ответ
Здравствуйте, pesadelo!
Предлагаю использовать unistd.h для Windows. В проекте произвести настройку, т.к. в unistd.h используются базовые типы, такие как int8_t, которые есть в visual studio. Из комментария в файле unistd.h следует, что базовые типы были взяты из файла <sys/types.h>. При повторном объявлении их можно отключить через #ifndef или просто закомментировать.
По ошибкам связанным с линковкой советую почитать MSDN.
Форма ответа