Как скомпилировать c использованием cc в Solaris? - PullRequest
0 голосов
/ 11 мая 2018

Я хочу протестировать свою программу в другой ОС, но gcc на самом деле не работает в Solaris, но есть cc.

Вот как я компилирую с gcc:

gcc -c quicksort.c sched.c -g -pthread -O3
gcc -o quicksort quicksort.o sched.o -Wall -g -pthread -O3

Я пытался скомпилировать с помощью cc, используя те же аргументы, но вот что я получаю:

quicksort.c:
sched.c:
"sched.c", line 233: warning: argument #3 is incompatible with prototype:
        prototype: pointer to function(pointer to void) returning pointer to void : "/usr/include/pthread.h", line 197
        argument : pointer to void

ld: fatal :  soname option (-h, --soname) is incompatible with building a dynamic executable
ld: fatal :  flags processing errors

Вот строка с первой ошибкой:

pthread_create(&s->tab_thread[i], NULL, (void *) main_thread, new_args_sched(i, s));

new_args_sched - это просто структура для передачи аргументов в функцию main_thread

Я не знаю, какой вариант мне использовать, я пробовал с -mt и -lpthread, но это не сработало У меня 3 файла quicksort.c с основным, sched.h и sched.c

Редактировать

Компьютер Solaris находится в ssh, он не мой, и я не могу его настроить. Версия gcc - 3.4.3, использующая только C90, мой код работает с C11. Только cc должно работать, но я не знаю, как правильно скомпилировать его ...

Я использую структуру для передачи main_thread следующим образом:

struct sched_args {
    int i;
    struct scheduler *s;
};

struct sched_args *
new_args_sched(int i, struct scheduler *s) {
    struct sched_args *args = malloc(sizeof(struct sched_args));
    if(args == NULL)
        return NULL;

    args->i = i;
    args->s = s;
    return args;
}

и вот как я получаю это в своей функции, когда использую pthread_create:

void main_thread(void *closure) {
    struct sched_args *args = (struct sched_args *)closure;
    int i = args->i;
    struct scheduler *s = args->s
    /* doing something */
}

1 Ответ

0 голосов
/ 11 мая 2018

Этот код

void main_thread(void *closure) {
    struct sched_args *args = (struct sched_args *)closure;
    int i = args->i;
    struct scheduler *s = args->s
    /* doing something */
}

должно быть

void *main_thread(void *closure) {
    struct sched_args *args = (struct sched_args *)closure;
    int i = args->i;
    struct scheduler *s = args->s
    /* doing something */
    return( NULL );
}

Функция pthread_create() POSIX-стандарта имеет в качестве прототипа

int pthread_create(pthread_t *restrict thread,
   const pthread_attr_t *restrict attr,
   void *(*start_routine)(void*), void *restrict arg);

Обратите внимание, что третий аргумент имеет тип void *(*start_routine)(void*) - адрес функции, принимающей void * параметр и возвращающей void *.

...