2016-02-17 3 views
1

У меня проблема с очередями сообщений в C в Ubuntu. Я использую VirtualBox для запуска Ubuntu.Ошибка сообщения об ошибке очереди сообщений Ubuntu

Я принял ошибку, которая является «неопределенной ссылкой на mq_open. Ld возвратил 1 статус выхода».

Я знаю, что есть такой же вопрос, как это, но я пробовал это решение, но оно не сработало, поэтому я хочу снова спросить. Пожалуйста помоги!

Вот мой код, это действительно просто, но я даже не могу его скомпилировать.

это мой deneme.c

#include <stdlib.h> 
#include <mqueue.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <errno.h> 
#include <string.h> 
#include <sys/types.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <sys/wait.h> 
#include <sys/stat.h> 

#include "sharedMsg.h" 

int main() 
{ 
    mqd_t mq; 
    mq = mq_open(MQNAME, O_RDWR | O_CREAT, 0666, NULL); 
} 

это мой sharedMsg.h

struct item{ 
    char *word; 
    int lineNum; 
}; 

#define MQNAME "/sentmsg" 

и, наконец, это мой Makefile

all: deneme 
deneme: deneme.c 
    gcc -g -Wall -o deneme deneme.c -lrt 
clean: 
    rm -fr *~ *.o 
+0

Просто, чтобы быть уверенным, вы выполнили 'Sudo APT-получить установку сборки-essential'? И ваш Makefile сломан. 'all:' требует 'deneme', но вы предоставили' deneme1'! – gollum

+0

yes Я выполнил build -essential, даже если это снова вернусь, я набираю это и снова устанавливаю –

ответ

1

Проблема с Makefile в том, что ваша цель all зависит от demene, но цель, которая определяет -lrt называется demene1. Таким образом, применяются правила вывода по умолчанию, и demene пытается соединиться без -lrt. Правило для deneme1 также неверно в том, что оно пытается создать двоичный файл с именем deneme, хотя правило должно создать deneme1. Чтобы решить эту проблему, измените первый третьей линий

all: deneme1 
deneme1: deneme.c 
    gcc -g -Wall -o deneme1 deneme.c -lrt 

или второй линии

deneme: deneme.c 
+0

Большое спасибо, я изменил вторую строку, но все равно выдал ту же ошибку –

+0

Что вы набрали для создания программы? Просто 'make'? Можете ли вы показать мне свой исправленный makefile? – fuz

+0

yes Я пишу только «make deneme», но он не может скомпилировать его, и я исправил свой makefile в моем вопросе также –

1

(Примечание: OP редактировал вопрос и исправил Makefile после этого ответа)

У вас сломанный Makefile.
Причина, по которой вы даже видели ошибку компоновщика, состоит в том, что вы, вероятно, выполнили make deneme. В этом случае make попытается скомпилировать dename.c с параметрами компилятора по умолчанию (потому что он не нашел цель под названием deneme), а параметры по умолчанию не включают -lrt.

Вы должны исправить Makefile (заменить deneme1: с deneme:)

all: deneme 

deneme: deneme.c 
    gcc -g -Wall -o deneme deneme.c -lrt 

clean: 
    rm -f deneme *~ *.o 
+0

Большое спасибо, я изменил вторую строку на «deneme», но все равно выдал ту же ошибку –

+0

Скомпилирует ли она, если вы вручную выполнили 'gcc deneme.c -o deneame -lrt'? – gollum

+0

yesss! , он компилируется и даже запускается, но как это возможно? как я могу исправить мой makefile, чем? –

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