2011-07-18 34 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