2012-05-23 48 views
0

當我們在Turbo C的工作,我們得到了所有的功能和頭文件在默認情況下,我們可以通過 #inlcude通常包括 例如:stdlib.h中,MATH.H如何在UNIX中包含可用於C的基本頭文件?

但寫一個簡單的程序,在使用這樣的頭文件我收到錯誤,因爲我無法包含這些文件。這些頭文件不是我們默認使用的嗎? 如果是,那麼如何使用這樣的頭文件? 當我用一個函數sqrt在「文件math.h」我得到誤差沒有得到包括math.h中,所以我不得不把它列入以下命令:

cc -c aaa.c -I/usr/local/ssl/include 
gcc -o aaa aaa.c -I/usr/local/ssl/include -L/usr/local/ssl/lib -lcrypto -lm 
./aaa 

在此命令:第二個是具有-lm在末端包括文件math.h

再次同樣我使用的功能itoa(),其是在stdlib.h中 其中我一個UNIX的Solaris服務器上執行的,但它是沒有得到包括和我gettig錯誤。現在我不知道如何添加這個頭文件。

+0

我覺得你很混亂,包括頭文件和鏈接共享庫。 – gspr

+1

'-lm'將鏈接到數學庫不包括math.h – Nick

+1

您實際上是否在源代碼中包含頭文件? – Nick

回答

0

您的編譯器應該提供命令行設置,您可以在其中指定include目錄,庫目錄等,如果您查看編譯器文檔,最好。

E.g. visual studio有一個命令開關-I指定包含文件夾

alt。在某些情況下,它可以被指定爲環境變量,例如設置INCLUDE = ...

這一切都取決於你使用的編譯器。

+0

但爲什麼在代碼中包含頭文件本身不起作用? – maddy2012

3

通常包含math.h標題。代碼可以編譯。但是,編譯器不會找到編譯後的二進制文件(math.h的實現)到鏈接,除非您指定它執行此操作。所以你必須在命令中指定-lm。

itoa()不是stdlib.h中的標準功能,所以請勿使用它。你可以使用sprintf代替。

+0

我想像這個「41 42 31 32」這樣在十六進制中得到像這個「AB12」這樣的字符串中每個單獨字符的ascii代碼。 sprintf會爲我的目的服務嗎?我還檢查了turbo c文檔。 itoa()存在於stdlib.h中 – maddy2012

+0

它可能在stdlib中。h的Turbo C,但它不在stdlib.h的標準中。對itoa的支持可能可以或不可以跨平臺使用,因此使用任何標準都是安全的。如果你想從字符串轉換爲長,你有strtol。如果你想從int/long轉換爲字符串,使用printf或sprintf(取決於你的目的)。 – nhahtdh

+0

如何找出鏈接到的文件的名稱? 像我連接math.h的實現文件-lm 我必須包含另一個在openssl的加密庫中的頭文件。 我想知道如果我有一個頭文件什麼是它的實現文件的名稱,以及如何鏈接它? – maddy2012

0

默認情況下,這些是從libc中導出的標準庫函數,它們應該在任何Unix/Linux版本中可用。您可以檢查在頭文件存在使用命令狀

find/-name "stdio.h" 2>/dev/null 

還要確保您使用鏈接-l 在libc中的libc

此外,您使用哪種編譯器?我建議你使用gcc,這樣包含配置已經爲編譯器完成了,你可以按原樣使用並開始。