将自定义库与 libcurl 函数链接
Linking custom library with libcurl functions
我有一个名为“libcurlwrapper”的自定义静态库,它只是包装了 libcurl 函数的执行,还有一个调用库函数的主应用程序。
可以编译库,但是在链接主应用程序时出现以下错误:
/usr/bin/ld: .//libcurlwrapper.a(curl_wrapper.o): in function `http3_demo()':
curl_wrapper.cpp:(.text+0xd): undefined reference to `curl_easy_init'
/usr/bin/ld: curl_wrapper.cpp:(.text+0x39): undefined reference to `curl_easy_setopt'
/usr/bin/ld: curl_wrapper.cpp:(.text+0x54): undefined reference to `curl_easy_setopt'
/usr/bin/ld: curl_wrapper.cpp:(.text+0x60): undefined reference to `curl_easy_perform'
/usr/bin/ld: curl_wrapper.cpp:(.text+0x73): undefined reference to `curl_easy_strerror'
/usr/bin/ld: curl_wrapper.cpp:(.text+0x9d): undefined reference to `curl_easy_cleanup'
collect2: error: ld returned 1 exit status
make: *** [Makefile:5: all] Error 1
究竟是什么导致了这些链接器错误?
关于如何摆脱它们的想法?
感谢任何帮助!
谢谢
libcurlwrapper > curl_wrapper.h:
#pragma once
#include <curl/curl.h>
void http3_demo();
libcurlwrapper > curl_wrapper.cpp:
#include "curl_wrapper.h"
void http3_demo() {
// Source taken from here: https://curl.se/libcurl/c/http3.html
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_3);
// Perform the request, res will get the return code
res = curl_easy_perform(curl);
// Check for errors
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
// Always cleanup
curl_easy_cleanup(curl);
}
printf("http3_demo: endmarker");
}
libcurlwrapper > 生成文件:
CXX = g++
CXXFLAGS = -lcurl
all:
@$(CXX) -c ./curl_wrapper.cpp $(CXXFLAGS)
@ar -rc libcurlwrapper.a ./curl_wrapper.o
main_app > main.cpp:
#include "curl_wrapper.h"
int main() {
http3_demo();
return 0;
}
main_app > 生成文件:
CXX = g++
CXXFLAGS = -L ./ -lcurlwrapper
all:
@$(CXX) main.cpp $(CXXFLAGS) -o main_app
一个静态库被编译成最终的可执行文件。静态库使用的外部函数只是引用。使用静态库的主要可执行文件需要解析对静态库引用的所有外部库的引用。在这种情况下,这意味着主要可执行项目需要 link 到 libcurl 库。
我有一个名为“libcurlwrapper”的自定义静态库,它只是包装了 libcurl 函数的执行,还有一个调用库函数的主应用程序。
可以编译库,但是在链接主应用程序时出现以下错误:
/usr/bin/ld: .//libcurlwrapper.a(curl_wrapper.o): in function `http3_demo()':
curl_wrapper.cpp:(.text+0xd): undefined reference to `curl_easy_init'
/usr/bin/ld: curl_wrapper.cpp:(.text+0x39): undefined reference to `curl_easy_setopt'
/usr/bin/ld: curl_wrapper.cpp:(.text+0x54): undefined reference to `curl_easy_setopt'
/usr/bin/ld: curl_wrapper.cpp:(.text+0x60): undefined reference to `curl_easy_perform'
/usr/bin/ld: curl_wrapper.cpp:(.text+0x73): undefined reference to `curl_easy_strerror'
/usr/bin/ld: curl_wrapper.cpp:(.text+0x9d): undefined reference to `curl_easy_cleanup'
collect2: error: ld returned 1 exit status
make: *** [Makefile:5: all] Error 1
究竟是什么导致了这些链接器错误?
关于如何摆脱它们的想法?
感谢任何帮助!
谢谢
libcurlwrapper > curl_wrapper.h:
#pragma once
#include <curl/curl.h>
void http3_demo();
libcurlwrapper > curl_wrapper.cpp:
#include "curl_wrapper.h"
void http3_demo() {
// Source taken from here: https://curl.se/libcurl/c/http3.html
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_3);
// Perform the request, res will get the return code
res = curl_easy_perform(curl);
// Check for errors
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
// Always cleanup
curl_easy_cleanup(curl);
}
printf("http3_demo: endmarker");
}
libcurlwrapper > 生成文件:
CXX = g++
CXXFLAGS = -lcurl
all:
@$(CXX) -c ./curl_wrapper.cpp $(CXXFLAGS)
@ar -rc libcurlwrapper.a ./curl_wrapper.o
main_app > main.cpp:
#include "curl_wrapper.h"
int main() {
http3_demo();
return 0;
}
main_app > 生成文件:
CXX = g++
CXXFLAGS = -L ./ -lcurlwrapper
all:
@$(CXX) main.cpp $(CXXFLAGS) -o main_app
一个静态库被编译成最终的可执行文件。静态库使用的外部函数只是引用。使用静态库的主要可执行文件需要解析对静态库引用的所有外部库的引用。在这种情况下,这意味着主要可执行项目需要 link 到 libcurl 库。