我需要在我在ubuntu机器上编写的一个软件中使用libcurl。我正在使用Eclipse编写和编译所有软件。当我将libcurl文件放在与.cpp文件相同的文件夹中,并在标题中包含curl.h文件时,当我尝试编译程序时,它会出现这些错误:
Building target: sms
Invoking: GCC C++ Linker
g++ -o"sms" ./src/sms.o
./src/sms.o: In function `main':
/home/geekman/workspace/sms/Debug/../src/sms.cpp:38: undefined reference to `curl_easy_init'
/home/geekman/workspace/sms/Debug/../src/sms.cpp:42: undefined reference to `curl_easy_setopt'
/home/geekman/workspace/sms/Debug/../src/sms.cpp:44: undefined reference to `curl_easy_setopt'
/home/geekman/workspace/sms/Debug/../src/sms.cpp:46: undefined reference to `curl_easy_perform'
/home/geekman/workspace/sms/Debug/../src/sms.cpp:47: undefined reference to `curl_easy_cleanup'
collect2: ld returned 1 exit status
make: *** [sms] Error 1
我从libcurl中获取了include文件夹的内容,并将它们放在与.cpp文件相同的文件夹中。然后在.cpp文件的标题中输入:
#include <curl/curl.h>
我也尝试过:
#include "curl/curl.h"
关于这个问题的任何想法?感谢。
答案 0 :(得分:51)
你的头文件包含就好了;你的问题发生在链接步骤。为了链接libcurl,您需要添加-lcurl
命令行选项,假设它已安装在标准目录中:
g++ -o sms ./src/sms.o -lcurl
如果它未安装在标准目录中,您还需要添加-L/path/to/libcurl
,例如类似的东西:
# Assuming that /home/geekman/workspace/libcurl is where libcurl.a is located
g++ -o sms ./src/sms.o -L/home/geekman/workspace/libcurl -lcurl
另请注意,-lcurl
选项必须在链接的目标文件列表后出现,否则将无法正确链接。
答案 1 :(得分:9)
您可以尝试使用curl-config --libs
。
答案 2 :(得分:4)
另一个答案(第一个很好)。考虑使用“pkg-config --libs libcurl”返回的输出作为编译器的参数。
例如,
CPPFLAGS =`pkg-config --libs libcurl`
g ++ $ CPPFLAGS myfile.o
Pkg-config是开源库与您通信的标准方式,如何链接它们/ #include他们的文件。
答案 3 :(得分:2)
任何使用ecplise CDT的人都需要做以下事情。首先在终端输入
curl-config --libs
在我的机器上,结果是
-L/usr/lib/i386-linux-gnu -lcurl
然后按照此截图进行操作,您就可以编译了。顺便说一句,不要忘记在代码中添加头文件
因此,您输入不带-L的库文件夹路径和不带-l的库名称,因为它们将由链接器自动添加。
答案 4 :(得分:1)
您必须将库链接到您的程序。使用gcc(和大多数其他编译器),您可以指定要与-lname_wo_lib
链接的库,例如-lcurl
答案 5 :(得分:0)
另见GNU GCC Manual - Options for Linking有关Adam Rosenfield所说选项的详细说明。对于标准搜索目录,请参阅An Introduction to GCC - for the GNU Compilers gcc and g++ - Setting Search Paths。
答案 6 :(得分:0)
除了第一个答案之外,我还必须链接 curlpp 库。所以要编译包含 curlpp 的 main.cpp 文件,我必须这样做:
g++ main.cpp -lcurl -lcurlpp
仅使用两个链接之一会返回关于不同链接的不同错误。重要的是要提醒,这只是因为我已经在标准包含文件夹中安装了所有必要的库