我一直试图让c ++程序使用libcurl并且无法弄明白。在使用C ++进行开发时,我通常使用visual studio,但是这个项目使用vi和使用VI和g ++的centos机器进行ssh会话。我已经运行yum install curl,yum install libcurl,yuminstall curl-devel和yum install libcurl-devel仍然无法让程序编译。
关于API的文档非常好,我可以找到有关如何在正确安装后使用libcurl的信息,但是安装它会被证明是痛苦的。
代码是:
#include<iostream>
#include<string>
#include<curl/curl.h>
using namespace std;
string data; //will hold the urls contents
size_t writeCallback(char* buf, size_t size, size_t nmemb, void* up)
{ //callback must have this declaration
//buf is a pointer to the data that curl has for us
//size*nmemb is the size of the buffer
for (int c = 0; c<size*nmemb; c++)
{
data.push_back(buf[c]);
}
return size*nmemb; //tell curl how many bytes we handled
}
int main(void) {
CURL* curl;
curl_global_init(CURL_GLOBAL_ALL);
curl=curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "https://domain.com");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCallback);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_USERPWD, "username:password");
curl_easy_perform(curl);
cout << endl << data << endl;
cin.get();
curl_easy_cleanup(curl);
curl_global_cleanup();
return 0;
}
当我尝试编译时出现以下错误:
/tmp/ccfeybih.o: In function `main':
helloworld.cpp:(.text+0x72): undefined reference to `curl_global_init'
helloworld.cpp:(.text+0x77): undefined reference to `curl_easy_init'
helloworld.cpp:(.text+0x96): undefined reference to `curl_easy_setopt'
helloworld.cpp:(.text+0xb1): undefined reference to `curl_easy_setopt'
helloworld.cpp:(.text+0xcc): undefined reference to `curl_easy_setopt'
helloworld.cpp:(.text+0xe7): undefined reference to `curl_easy_setopt'
helloworld.cpp:(.text+0xf3): undefined reference to `curl_easy_perform'
helloworld.cpp:(.text+0x132): undefined reference to `curl_easy_cleanup'
helloworld.cpp:(.text+0x137): undefined reference to `curl_global_cleanup'
collect2: ld returned 1 exit status
我找不到从这里去的地方。
答案 0 :(得分:6)
您获得的错误是链接器错误。链接器无法找到curl库。 您需要指定链接器在链接时搜索适当库的路径。
在这种情况下(如果您在标准的lib目录中安装了lib curl,例如/ usr / lib,r / usr / local / lib),则以下内容应该有效:
g ++ you_file_name.cpp -lcurl
否则,您必须指定可以找到库的目录的路径。 例如:
g ++ -L / curl / lib / dir -lcurl you_file_name.cpp。
当有多个库要链接时,这些事情变得复杂,因此最好使用诸如CMake之类的构建系统来协助管理包含目录/库路径和其他各种事物。
答案 1 :(得分:3)
构建针对libcurl的正确方法是使用pkg-config
(与许多现代包一样)。如果是直接g++
电话,那就是:
g++ $(pkg-config --cflags libcurl) helloworld.cpp $(pkg-config --libs libcurl)
这将自动处理libcurl的非常见(但仍然正确)安装,其中库和标头不在系统include / library目录中。如果没有pkg-config,您需要始终自己找出正确的路径。
如果您开始使用自动工具,则可以使用configure.ac
:
PKG_CHECK_MODULES([CURL], [libcurl])
然后在Makefile.am
:
helloworld_CPPFLAGS = $(CURL_CFLAGS)
helloworld_LIBS = $(CURL_LIBS)