2016-09-14 2 views
0

Привет и спасибо заранее за все проблемы, которые эта платформа решила для меня в прошлом. К сожалению, я нашел проблему, которую я не мог решить.Ошибки с использованием UNIX time.h после изменения стандарта C на c99

Я довольно новичок в cmake и расширил демонстрационный проект с новым исполняемым файлом и некоторыми библиотечными файлами. У меня нет проблем с компиляцией демонстрационного проекта. Однако мой новый проект необходимо скомпилировать с помощью стандартного c99, и вдруг я получаю ошибки, реализующие структуру timespec с time.h. Это также используется в демонстрационном проекте, поэтому я снова скомпилировал демо с c99, и у меня такая же проблема.

Запуск этого на Ubuntu, с помощью компилятора GCC и CMake версии 2.8.7

Надежда У меня есть все необходимые детали покрыты. Если нет, сообщите мне и заблаговременно за ваши усилия!

С наилучшими пожеланиями

Edit # 1: Сообщения об ошибках я получаю:
-> CLOCK_MONOTONIC < не объявлена ​​(первым использовать в этой функции)
- поле 'tv_nsec' не может быть решен
- поле " tv_sec»не может быть решена
- символ 'CLOCK_MONOTONIC' не может быть решена
- Предупреждения о неявном объявлении функций 'clock_gettime', 'nanosleep', 'timeradd', '' timercmp

Edit # 2: выход ошибка марки VERBOSE = 1

/usr/bin/gcc -D_XOPEN_SOURCE=600 -I/home/localadmin/Eclipse_Workspace/SOEM_master/soem -I/home/localadmin/Eclipse_Workspace/SOEM_master/osal -I/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux -I/home/localadmin/Eclipse_Workspace/SOEM_master/oshw/linux -std=c99 -o CMakeFiles/soem.dir/osal/linux/osal.c.o -c /home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c 
/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c:60:50: Warning: »struct timezone« declared in parameter list [activated by default] 
/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c:60:50: Warning: range of validity includes only this definition or declaration [activated by default] 
/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c: In function »osal_timer_start«: 
/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c:105:4: Warning: Implicit function »timeradd« [-Wimplicit-function-declaration] 
/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c: In function »osal_timer_is_expired«: 
/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c:120:4: Warning: Implicit declaration of function »timercmp« [-Wimplicit-function-declaration] 
/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c:120:61: Error: expected expression before »<« token 
make[2]: *** [CMakeFiles/soem.dir/osal/linux/osal.c.o] Error 1 
make[2]: Leaving directory '/home/localadmin/Eclipse_Workspace/SOEM_master/build' 
make[1]: *** [CMakeFiles/soem.dir/all] Error 2 
make[1]: Leaving directory '/home/localadmin/Eclipse_Workspace/SOEM_master/build' 
make: *** [all] Error 2 

Это был выход после definining _XOPEN_SOURCE = 600, что было предложено в другом потоке, который был размещен ниже. Таким образом, структура timespec доступна, но функций нет.

Edit # 3: минимальный, полный и проверяемый пример

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <sys/time.h> 
int main() 
{ 
struct timespec test; 
test.tv_sec = 0; 
struct timeval start_time; 
struct timeval timeout; 
struct timeval stop_time; 
timeradd(&start_time, &timeout, &stop_time); 
return 0; 
} 

компилируется без проблем. Если я использую GCC mcv_example.c -std = C99 я получаю:

mcv_example.c: In function 'main': 
mcv_example.c:24:18: error: storage size of 'test' isn't known 
mcv_example.c:29:2: warning: implicit declaration of function 'timeradd' [-Wimplicit-function-declaration] 

Редактировать # 4: Решение для меня было с помощью gnu99 вместо c99. Теперь я могу создать UNIX Makefiles с cmake, но не могу создать рабочий проект Eclipse.
Поскольку это другая проблема, я предполагаю, что этот случай закрыт, и спасибо всем за вашу помощь и усилия!

+0

Пожалуйста, поделитесь ошибки, которые вы получите. –

+0

Извините, не подумал об этом. Добавил его в оригинальное сообщение, чтобы его увидели больше людей. – jckaos

+0

Нет смысла упоминать 'cmake' вообще. Просто скопируйте/вставьте ошибку, сообщенную gcc в оболочке после ввода: 'make VERBOSE = 1' – malat

ответ

0

Как man timeradd говорит, определение функции timeradd доступна только тогда, когда определяется _DEFAULT_SOURCE функция тест-макро:

Feature Test Macro Requirements for glibc (see feature_test_macros(7)): 

    All functions shown above: 
     Since glibc 2.19: 
      _DEFAULT_SOURCE 
     Glibc 2.19 and earlier: 
      _BSD_SOURCE 

Описание для _DEFAULT_SOURCE макрос в man feature_test_macros говорит:

Этот макрос может быть для определения «дефолтных» определений , даже если значения по умолчанию в противном случае были бы отключены, , как это происходит, когда индивидуальные макросы явно определены или компилятор вызывается в одном из своих «стандартных» режимов (например, cc -std = c99).

Так что вам нужно определить явно _DEFAULT_SOURCE макрос для макияжа функции timeradd быть доступны в режиме -std=c99:

#define _DEFAULT_SOURCE 
#include <sys/time.h> 
... 
timeradd(...); 
+0

Спасибо за ваше предложение. Я решил, что с помощью gnu99 вместо c99. Теперь все работает отлично, когда я создаю UNIX Makefiles с cmake. Я все еще получаю сообщение об ошибке, что timespec не может быть разрешено, когда я пытаюсь создать проект Eclipse, но это другая история, я думаю. – jckaos

Смежные вопросы