[C++] Прога компилится в Linux, но не компилится в Cygwin

Biglem

Раньше не сталкивался с Cygwin, сегодня впервые установил на виртуальную машину с виндой
Ситуация такая, есть прога, которая компилится в Linux
более того, даже в винде она компилится под цигвином - но только не у меня
может в cygwin библиотек не хватает каких-то?
при компиляции вылетает вот с такой ошибкой:
In file included from /usr/include/sys/stat.h:20,
from /usr/include/sys/fcntl.h:164,
from /usr/include/fcntl.h:14,
from ../../../../hsboard/common/commonfunctions.h:23,
from ../../billvalidator/core/CCNET/CCNETbase/CCNETbase.h:26,
from ../../billvalidator/core/CCNET/CCNETbase/CCNETbase.cpp
/usr/include/cygwin/stat.h error: field `st_atim' has incomplete type
/usr/include/cygwin/stat.h error: field `st_mtim' has incomplete type
/usr/include/cygwin/stat.h error: field `st_ctim' has incomplete type
make: *** [CCNETbase.o] Error 1
в файле /usr/include/cygwin/stat.h эти строки выглядят так:
struct stat
{
dev_t st_dev;
ino_t st_ino;
mode_t st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
dev_t st_rdev;
off_t st_size;
timestruc_t st_atim;
timestruc_t st_mtim;
timestruc_t st_ctim;

blksize_t st_blksize;
blkcnt_t st_blocks;
long st_spare4[2];
};
видимо, не определена timestruc_t
пробовал подрубать <cygwin/types.h> - тот же результат
что я делаю не так?

Realist

Cygwin — среда загадочная. Многие вещи на ней не собираются, поскольку не все фичи линукса реализованы там. Обычно в таких случаях помогает обновление Cygwin и гугление по сообщению об ошибке.

Biglem

мдя уж
версия самая последняя
гугл молчит как партизан ;(

sergey_m

Может надо sys/types.h перед sys/stat.h?

Ivan8209

fgrep -r timestruc_t /usr/include
---
"Аллах не ведёт людей неверных."

otets-mihail

/usr/include/cygwin/types.h

Ivan8209

fgrep -r cygwin/types.h /usr/include
---
"Аллах не ведёт людей неверных."

otets-mihail

sys/types.h =)

Ivan8209

b> что я делаю не так?
man grep
---
"Аллах не ведёт людей неверных."

Biglem

греп я конечно прекрасно знаю и использовал его в первую очередь:
$ grep -r timestruc_t /usr/include
/usr/include/cygwin/msg.h: timestruc_t msg_stim; /* Time of last msgsnd (
). */
/usr/include/cygwin/msg.h: timestruc_t msg_rtim; /* Time of last msgrcv (
). */
/usr/include/cygwin/msg.h: timestruc_t msg_ctim; /* Time of last change.
*/
/usr/include/cygwin/sem.h: timestruc_t sem_otim; /* Last semop time. *
/
/usr/include/cygwin/sem.h: timestruc_t sem_ctim; /* Last time changed by
semctl . */
/usr/include/cygwin/shm.h: timestruc_t shm_atim; /* Time of last
shmat . */
/usr/include/cygwin/shm.h: timestruc_t shm_dtim; /* Time of last
shmdt . */
/usr/include/cygwin/shm.h: timestruc_t shm_ctim; /* Time of last
change by shmctl . */
/usr/include/cygwin/stat.h: timestruc_t st_atim;
/usr/include/cygwin/stat.h: timestruc_t st_mtim;
/usr/include/cygwin/stat.h: timestruc_t st_ctim;
/usr/include/cygwin/stat.h: timestruc_t st_atim;
/usr/include/cygwin/stat.h: timestruc_t st_mtim;
/usr/include/cygwin/stat.h: timestruc_t st_ctim;
/usr/include/cygwin/stat.h: timestruc_t st_atim;
/usr/include/cygwin/stat.h: timestruc_t st_mtim;
/usr/include/cygwin/stat.h: timestruc_t st_ctim;
/usr/include/cygwin/types.h:#ifndef __timestruc_t_defined
/usr/include/cygwin/types.h:#define __timestruc_t_defined
/usr/include/cygwin/types.h:typedef struct timespec timestruc_t;
/usr/include/cygwin/types.h:#endif /*__timestruc_t_defined*/
по теме тут только sys/types.h

Biglem

попробовал тоже впервую же очередь
чтоб уж не сомневаться сделал так
$cat ../../../../hsboard/common/commonfunctions.h
---cut----
#ifdef __WIN32__
#include <conio.h>
#include <sys/types.h>
#include "/usr/include/cygwin/types.h"

#include <sys/stat.h>
#endif
#include <fcntl.h>
#include "gheader.h"
----cut----
ошибка та же и там же ;(
щас попробую ещё системный fcntl.h поправлю - посмотрю что будет

Ivan8209

А если #ifndef?
Не извращайся, напиши без этой ерунды:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "gheader.h"

---
...Я работаю...

mira-bella


/usr/include/cygwin/types.h:typedef struct timespec timestruc_t;

И что эта строчка тебе ни о чем не говорит?
Кстати это C, а не C++.

mira-bella

Неужели действительно такая проблема найти где определяется struct timespec и инклюдить этот файл?
подозреваю

#include <time.h>

первой строчкой должен помочь

Ivan8209


$ fgrep -r timespec /usr/include/sys/types.h
struct timespec {
struct timespec it_interval; /* Timer period */
struct timespec it_value; /* Timer expiration */
$ uname -mrs
CYGWIN_NT-5.1 1.5.18(0.132/4/2) i686

---
"Аллах не ведёт людей неверных."

Biglem

Кстати, а ты не пробовал почитать тред?
Кстати, моя прога написана на c++, то что в неё включён системный файл, который (разумеется) является си это не причина
Собственно, я ждал, что ошибка именно в коде, а не в системных библиотеках, что логично, кстати.
да, кстати

mira-bella

Кстати, а ты не пробовал почитать тред?
причитал разумеется
я что-то недопонял?
просвети
да, кстати
что "да"?

Biglem

причитал разумеется
я что-то недопонял?
просвети
я просил помочь, а не обсудить мои умственные способности и особенно способность отличать c от c++
и если ты написал сюда не с этой целью, то к чему вообще твой пост, повторяющий уже дважды сказанное предложение (при том что я на оба ответил но только с особенной ядовитостью?
либо ты не читал тред, либо.. либо объясни сам в чём фишка, не дочитав тред до конца, не обдумав написанное, писать первое что придёт в голову?

Biglem

что "да"?
кстати

mira-bella

если у тебя ошибка возникает исключительно в результате факта инклюда неких заголовков, то я пока вижу только одну возможную ее причину - это ошибка в <sys/types.h>:

#ifndef __time_t_defined
typedef _TIME_T_ time_t;
#define __time_t_defined
/* Time Value Specification Structures, P1003.1b-1993, p. 261 */
struct timespec {
time_t tv_sec; /* Seconds */
long tv_nsec; /* Nanoseconds */
};
struct itimerspec {
struct timespec it_interval; /* Timer period */
struct timespec it_value; /* Timer expiration */
};
#endif

очевидно #endif должен быть до структур,
в противном случае, если где-то тип time_t ранее определен вместе с макросом __time_t_defined, но без структур (а это вполне логично при используемых соглашениях и даже встречается в <sys/timeb.h> того же cygwin то эти две структуры не будут определены в <sys/types.h>, т.е. например если <sys/timeb.h> инклюдить до первого инклюда <sys/types.h>, то инклюд <sys/stat.h> выдаст ошибку.
PS: если ты "ждал, что ошибка именно в коде, а не в системных библиотеках", что чего ты этот самый код не запостил?

Biglem

респект
после этого действительно собирается
но только при линковке вылезает куча ошибок 'undefined reference', которые вообще непонятно чем обоснованы
в общем, я решил забить на cygwin
один из разработчиков сказал, что должно под mingw32 собраться - сейчас ставлю
спасибо всем за помощь
, сорри за излишние наезды
просто работа вся горит, не очень было приятно выслушивать о различиях c и c++
а так, как я уже сказал - респект
Оставить комментарий
Имя или ник:
Комментарий: