[英]Why do I get the error “cannot find -lcurl” when trying to compile example code?
I'm trying to follow this curl example and get it to compile: 我正在尝试遵循以下curl示例并进行编译:
https://github.com/curl/curl/blob/master/docs/examples/smtp-mail.c https://github.com/curl/curl/blob/master/docs/examples/smtp-mail.c
https://github.com/curl/curl/blob/master/docs/examples/Makefile.example https://github.com/curl/curl/blob/master/docs/examples/Makefile.example
And what I have so far is borderline copy/pasted, but I keep getting an error "cannot find -lcurl" 到目前为止,我的工作是边界复制/粘贴,但是我不断收到错误消息“找不到-lcurl”
This is what I have for the code: 这就是我的代码:
#include <stdio.h>
#include <string.h>
#include "curl-7.64.0/include/curl/curl.h"
/*
* For an SMTP example using the multi interface please see smtp-multi.c.
*/
/* The libcurl options want plain addresses, the viewable headers in the mail
* can very well get a full name as well.
*/
#define FROM_ADDR "<sender@example.org>"
#define TO_ADDR "<addressee@example.net>"
#define CC_ADDR "<info@example.org>"
#define FROM_MAIL "Sender Person " FROM_ADDR
#define TO_MAIL "A Receiver " TO_ADDR
#define CC_MAIL "John CC Smith " CC_ADDR
static const char *payload_text[] = {
"Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
"To: " TO_MAIL "\r\n",
"From: " FROM_MAIL "\r\n",
"Cc: " CC_MAIL "\r\n",
"Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
"rfcpedant.example.org>\r\n",
"Subject: SMTP example message\r\n",
"\r\n", /* empty line to divide headers from body, see RFC5322 */
"The body of the message starts here.\r\n",
"\r\n",
"It could be a lot of lines, could be MIME encoded, whatever.\r\n",
"Check RFC5322.\r\n",
NULL
};
struct upload_status {
int lines_read;
};
static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp)
{
struct upload_status *upload_ctx = (struct upload_status *)userp;
const char *data;
if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) {
return 0;
}
data = payload_text[upload_ctx->lines_read];
if(data) {
size_t len = strlen(data);
memcpy(ptr, data, len);
upload_ctx->lines_read++;
return len;
}
return 0;
}
int main(void)
{
CURL *curl;
CURLcode res = CURLE_OK;
struct curl_slist *recipients = NULL;
struct upload_status upload_ctx;
upload_ctx.lines_read = 0;
curl = curl_easy_init();
if(curl) {
/* This is the URL for your mailserver */
curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com");
/* Note that this option isn't strictly required, omitting it will result
* in libcurl sending the MAIL FROM command with empty sender data. All
* autoresponses should have an empty reverse-path, and should be directed
* to the address in the reverse-path which triggered them. Otherwise,
* they could cause an endless loop. See RFC 5321 Section 4.5.5 for more
* details.
*/
curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM_ADDR);
/* Add two recipients, in this particular case they correspond to the
* To: and Cc: addressees in the header, but they could be any kind of
* recipient. */
recipients = curl_slist_append(recipients, TO_ADDR);
recipients = curl_slist_append(recipients, CC_ADDR);
curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
/* We're using a callback function to specify the payload (the headers and
* body of the message). You could just use the CURLOPT_READDATA option to
* specify a FILE pointer to read from. */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
/* Send the message */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
/* Free the list of recipients */
curl_slist_free_all(recipients);
/* curl won't send the QUIT command until you call cleanup, so you should
* be able to re-use this connection for additional messages (setting
* CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT as required, and calling
* curl_easy_perform() again. It may not be a good idea to keep the
* connection open for a very long time though (more than a few minutes
* may result in the server timing out the connection), and you do want to
* clean up in the end.
*/
curl_easy_cleanup(curl);
}
return (int)res;
}
And this is what I'm using for the makefile: 这就是我用于makefile的内容:
TARGET = email
OBJS= smtp-mail.o
CC = gcc
CFLAGS = -c -g
LDFLAGS = -L/curl-7.64.0/lib
LIBS = -lcurl -lsocket -lnsl -lssl -lcrypto
$(TARGET) : $(OBJS)
$(CC) -o $(TARGET) $(OBJS) $(LDFLAGS) $(LIBS)
smtp-mail.o : smtp-mail.c
$(CC) $(CFLAGS) $<
Does anyone know why this would be happening? 有谁知道为什么会这样?
EDIT: I updated the paths in smtp-mail.c and the makefile: 编辑:我更新了smtp-mail.c和makefile中的路径:
#include "/user/jastei/Email/curl-7.58.0/include/curl/curl.h"
LDFLAGS = -L/user/jastei/Email/curl-7.58.0/lib/ -L/user/jastei/Email/curl-7.58.0/lib/vtls
I ran the commands: 我运行了命令:
./configure --prefix=/user/jastei/Email/curl-7.58.0 --disable-shared
make
make install
At first, it looked like nothing has changed, however, instead of "cannot find -lcurl" I got this: cannot find -lsocket 乍一看,似乎一切都没有改变,但是,我得到的是“找不到-lsocket”,而不是“找不到-lcurl”
EDIT 2: Regarding cmake...when I called cmake: 编辑2:关于cmake ...当我叫cmake时:
/user/jastei/Email/cmake/bin/cmake CMakeLists.txt
I got this error: 我收到此错误:
File /user/jastei/Email/cmake/bin/headers/conf.h.in does not exist.
You are going to need to build libcurl yourself to get the static library that you want to compile with. 您将需要自己构建libcurl以获得要编译的静态库。 You can grab the latest release at https://github.com/curl/curl/releases/tag/curl-7_64_0 . 您可以在https://github.com/curl/curl/releases/tag/curl-7_64_0上获取最新版本。 Download the source code zip archive. 下载源代码zip存档。 You can view https://curl.haxx.se/docs/install.html for full building instructions but basically you need to extract the source code, open your terminal, cd
to the directory that has the configure
script and the Makefile
, and then type the following commands: 您可以查看https://curl.haxx.se/docs/install.html以获得完整的构建说明,但是基本上您需要提取源代码,打开终端, cd
到具有configure
脚本和Makefile
,以及然后键入以下命令:
# change the below prefix path to where you want curl to install
# e.g. ~/curl-7.64.0
./configure --prefix=/path/to/install/to --disable-shared
make
make install
Let it work its magic. 让它发挥其魔力。 That should give you the files that you need. 那应该给您您需要的文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.