3 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊
您可能會(huì)發(fā)現(xiàn)您必須與所使用的任何系統(tǒng)上的數(shù)學(xué)庫(kù)鏈接,例如:
gcc -o myprog myprog.c -L/path/to/libs -lm
^^^ - this bit here.
包括標(biāo)題讓編譯器知道函數(shù)的聲明,但它并沒(méi)有必然自動(dòng)鏈接到執(zhí)行該功能所需要的代碼。
否則,您需要向我們展示您的代碼,您的編譯命令和您正在運(yùn)行的平臺(tái)(操作系統(tǒng),編譯器等)。
以下代碼可以編譯和鏈接:
#include <math.h>
int main (void) {
int max = sqrt (9);
return 0;
}
請(qǐng)注意,某些編譯系統(tǒng)取決于在命令行上給出庫(kù)的順序。那樣的話,我的意思是它們可以按順序處理這些庫(kù),并且只能使用它們來(lái)滿足序列中該點(diǎn)上未解析的符號(hào)。
因此,例如,給定命令:
gcc -o plugh plugh.o -lxyzzy
gcc -o plugh -lxyzzy plugh.o
并且plugh.o需要xyzzy庫(kù)中的某些內(nèi)容,第二個(gè)可能無(wú)法正常工作。在列出庫(kù)的那一刻,沒(méi)有任何未解決的符號(hào)可以滿足。
當(dāng)從解析的符號(hào)plugh.o 都出現(xiàn),為時(shí)已晚。

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是我的觀察,首先需要將標(biāo)頭math.h作為標(biāo)頭文件中sqrt()聲明的函數(shù)包括在內(nèi)math.h。例如
#include <math.h>
其次,如果您閱讀sqrt的手冊(cè)頁(yè),您會(huì)注意到該行-lm。
#include <math.h> /* header file you need to include */
double sqrt(double x); /* prototype of sqrt() function */
Link with -lm. /* Library linking instruction */
但是應(yīng)用程序仍然說(shuō)未定義對(duì)sqrt的引用。您在這里看到任何問(wèn)題嗎?
編譯器錯(cuò)誤是正確的,因?yàn)槟形磳⒊绦蚺c庫(kù)lm鏈接并且鏈接器無(wú)法找到的引用sqrt(),您需要顯式鏈接。例如
gcc -Wall -Wextra -Werror -pedantic test.c -lm
- 3 回答
- 0 關(guān)注
- 979 瀏覽
添加回答
舉報(bào)