2011-07-18 38 views
0

我試圖編譯一個C項目,我一直在運行OS X的遠程服務器上工作。該項目部分取決於libcurl。我只能通過我的管理員帳戶遠程訪問本機。gcc將不包括命令行上的libcurl OS X

當我嘗試做項目時,我不斷收到有關libcurl函數和常量沒有被定義的錯誤。我得出結論,編譯器沒有正確包含libcurl。

我正在使用fink爲所有依賴項(postgres,curl和其他一些)安裝opensource軟件,除curl外,所有依賴項都可以正常工作。

我的編譯器命令是這樣的:

gcc -ggdb -ansi -Wall -D_GNU_SOURCE -L `/sw/bin/pg_config --libdir` `/sw/bin/curl-config --cflags` -I `/sw/bin/pg_config --includedir` -lpq -lcurl -lpthread -lm `/sw/bin/curl-config --libs` -c Client.c 

如果我做一個測試文件,像這樣:

/sw/bin/curl http://www.google.com/ --libcurl test.c 

,然後嘗試用編譯它:

gcc test.c `/sw/bin/curl-config --cflags` `/sw/bin/curl-config --libs` -o test.o 

它還失敗。任何人都可以幫我解釋一下這個問題嗎?

+1

我沒有安裝fink,但您的第二個示例適用於系統捲曲。我在你的第二個例子中注意到你將輸出發送到'test.o',但是因爲你沒有傳遞gcc這個'-c'標誌,這可能不是你期望的。 – Hugh

回答

2

一個編譯行是:

gcc -ggdb -ansi -Wall -D_GNU_SOURCE -L `/sw/bin/pg_config --libdir` \ 
    `/sw/bin/curl-config --cflags` -I `/sw/bin/pg_config --includedir` \ 
    -lpq -lcurl -lpthread -lm `/sw/bin/curl-config --libs` -c Client.c 

這將需要Client.c併產生Client.o,目標文件。它不需要圖書館信息;由於-c選項沒有鏈接發生。

其他彙編行是:

gcc test.c `/sw/bin/curl-config --cflags` `/sw/bin/curl-config --libs` -o test.o 

它是aconventional與 '.o' 結束可執行文件的名稱;它會導致混亂。但是,如果test.c僅引用標準庫和libcurl的函數,則它應該「有效」。

在我的Mac上,/usr/bin中有curl-config的副本。


試試這個測試程序:

$ cat curltest.c 
#include <stdio.h> 
#include <curl/curl.h> 

int main(void) 
{ 
    if (curl_global_init(0) == CURLE_OK) 
    { 
     printf("CURL version %s\n", curl_version()); 
     curl_global_cleanup(); 
    } 
    else 
     fprintf(stderr, "Failed to initialize CURL\n"); 

    return 0; 
} 
$ cc -o curltest $(curl-config --cflags) curltest.c $(curl-config --libs) 
$ file curltest 
curltest: Mach-O 64-bit executable x86_64 
$ otool -L curltest 
curltest: 
    /usr/lib/libcurl.4.dylib (compatibility version 6.0.0, current version 6.1.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11) 
$ curltest 
CURL version libcurl/7.19.7 OpenSSL/0.9.8r zlib/1.2.3 
$ 

這是在MacOS X 10.6.8。

+0

我有curl-config的兩個副本。/usr/bin中有一個與/ sw/bin /中的輸出不同。由於/ sw /是包含我所有fink安裝的目錄,因此我選擇了該目錄。在實踐中都沒有實際的工作。 – KeatsKelleher