2010-05-18 78 views
3

在這些日子裏,我在玩線程庫並試圖實現一些功能。 本教程的一種說法是:運行程序使用:揭祕lpthreads下的gcc

gcc -lpthread -lrt -lc -lm project1.c scheduler.c -o out 

首先,我需要的是什麼GCC中的每一行做深入的瞭解,

  • lpthread是用來做什麼? lrt -lc -lm有什麼貢獻?

  • project1.c和scheduler.c是一起編譯的,所以我應該理解什麼?我檢查了
    的代碼,其中任何一個都沒有包含在project1.c或scheduler.c中。

  • 作爲輸出顯然它給出了「out」。

其次筆者指出運行,你必須使用

./out number filename (For example, ./out 2 sample.txt) 

爲了使這些清楚據我瞭解的主要功能得到數量和sample.txt的作爲輸入。(該計劃? )

感謝您的回答,並讓我清楚。

+1

如果我是你,我會嘗試刪除'-lrt -lc'開關出於好奇。我懷疑這個程序仍然會在沒有它們的情況下編譯,但我不確定。 – 2010-05-18 22:00:49

+0

@喬伊亞當斯,是的,它的工作原理。 – berkay 2010-05-18 22:05:11

回答

8

-l參數表示 - 指向特定庫的鏈接。更多信息請參見GCC manual

因此-lpthread裝置連結libpthread.so(或pthread.a) 同樣對於-lm-lrt-lc

[LIB]並行線程[。所以] - POSIX threads

[LIB ] M [。所以] - 數學標準庫(正弦,餘弦等)

[LIB] RT [。所以] - POSIX realtime extensions

[LIB] C [。所以] - 的libc(標準C庫)

.c文件中的每一個被編譯爲.o對象文件(這些被稱爲編譯單元),並與上述的庫鏈接在一起。

你說得對如何傳遞命令行參數是正確的。

+0

謝謝,不清楚的問題是爲什麼鏈接?如果我在我的.c文件中包含庫,爲什麼我需要使用它?你能否以c,C++處理這些問題的方式向我推薦一些教程? (我想我有一些問題來了解c,C++編譯的細節) – berkay 2010-05-18 22:19:29

+1

@Berkay:頭文件通常只聲明*聲明過程和全局變量。 (函數簽名不包含主體)。通過鏈接庫提供實際的身體*解決*否則未解決的參考。 也就是說,通過包含你承諾編譯器的頭文件,你確實有這樣一個函數。編譯器留下了一個引用,後來由庫中的鏈接器填充。 – EFraim 2010-05-18 22:20:49

+1

關於鏈接的這一章http://publications.gbdirect.co.uk/c_book/chapter4/linkage.html可以提供幫助。 – EFraim 2010-05-18 22:22:38

4

-lxxx意味着鏈接名爲libxxx庫,所以你告訴它鏈接libpthreadlibrtlibclibm

你真的不需要指定鏈接libc - 這通常是默認情況下發生的。 libm是數學庫,因此大多數代碼都需要它來執行浮點操作。 libpthread包含pthreads函數(例如,pthread_create),因此任何創建/使用pthread的代碼都需要鏈接到它。

project1.c和scheduler.c被一起編譯意味着一個代碼可以調用另一箇中的代碼。

您對命令行參數的理解看起來是正確的。

+0

project1.c和scheduler.c被編譯在一起意味着一個代碼可以調用另一箇中的代碼:所以我明白一些外部函數正在使用中。 – berkay 2010-05-18 22:01:49

+0

@Berkay:是的,這是正確的。 – 2010-05-18 22:09:15

1

爲輸出清楚它給

是你指定的這個與-o out


GCC不只是你.c文件編譯爲.o文件「走出去」,但還鏈接編譯文件和您用-l指定的庫合併爲一個二進制文件。


./out number filename (For example, ./out 2 sample.txt) 

號和文件名與出了名的程序兩個參數。

+0

爲什麼我應該是任何一種機器人? ;) – TheMorph 2010-05-18 22:03:52

+0

感謝您的回答,我感謝您只能將不明確的問題,而不是複製。 – berkay 2010-05-18 22:09:32