2016-02-17 54 views
1

我在Ubuntu中的C中的消息隊列有問題。我使用VirtualBox運行Ubuntu。Ubuntu消息隊列Makefile錯誤

我把錯誤是「未定義參考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" 

終於這是我的生成文件

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

只是可以肯定,你執行'命令和apt-get安裝集結essential'?你的Makefile壞了。 'all:'需要'deneme',但你提供了'deneme1'! – gollum

+0

是我執行構建-essential甚至再次肯定,我鍵入此並重新安裝 –

回答

1

與你的Makefile的問題是,你的目標all取決於demene但指定-lrt目標被稱爲demene1。因此,默認推理規則開始執行,並且demene試圖鏈接而沒有-lrtdeneme1的規則也是錯誤的,因爲它試圖創建一個名爲deneme的二進制文件,即使規則應該創建deneme1。爲了解決這個問題,第一至第三線改爲

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

或第二線

deneme: deneme.c 
+0

非常感謝,我改變了第二行,但它仍然給出了相同的錯誤 –

+0

你輸入什麼來構建程序?只是'做'?你能告訴我你修正的makefile嗎? – fuz

+0

是的,我寫的只是「make deneme」,但它不能編譯它,我在我的問題中更正了我的makefile文件 –

1

(注:OP曾主編問題並修復了這個答案後的Makefile)

您的Makefile文件已損壞。
你之所以還看過的鏈接錯誤是,你可能已經執行make deneme。在這種情況下make將嘗試編譯dename.c使用默認的編譯器選項(因爲它沒有找到一個名爲deneme目標)和默認選項不包括-lrt

你必須解決您的Makefile(與deneme:取代deneme1:

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!它編譯甚至運行,但這怎麼可能呢?我怎樣才能修復我的生成文件? –