#include <stdio.h> #include <dlfcn.h> #include <curl/curl.h> int main() { // 加载 libcurl 动态库 void* handle = dlopen("libcurl.dylib", RTLD_LAZY); if (!handle) { fprintf(stderr, "Error loading libcurl: %s\n", dlerror()); return 1; } // 获取 libcurl 中的函数指针 typedef void (*curl_global_init_func)(int); typedef void (*curl_easy_cleanup_func)(CURL *); typedef void (*curl_global_cleanup_func)(); typedef CURL* (*curl_easy_init_func)(); typedef CURLcode (*curl_easy_perform_func)(CURL *, ...); typedef CURLcode (*curl_easy_setopt_func)(CURL *, CURLoption, ...); curl_global_init_func curl_global_init = (curl_global_init_func)dlsym(handle, "curl_global_init"); curl_easy_cleanup_func curl_easy_cleanup = (curl_easy_cleanup_func)dlsym(handle, "curl_easy_cleanup"); curl_global_cleanup_func curl_global_cleanup = (curl_global_cleanup_func)dlsym(handle, "curl_global_cleanup"); curl_easy_init_func curl_easy_init = (curl_easy_init_func)dlsym(handle, "curl_easy_init"); curl_easy_perform_func curl_easy_perform = (curl_easy_perform_func)dlsym(handle, "curl_easy_perform"); curl_easy_setopt_func curl_easy_setopt = (curl_easy_setopt_func)dlsym(handle, "curl_easy_setopt"); if (!curl_global_init || !curl_easy_cleanup || !curl_global_cleanup || !curl_easy_init || !curl_easy_perform || !curl_easy_setopt) { fprintf(stderr, "Error getting function pointers: %s\n", dlerror()); dlclose(handle); return 1; } // 使用 libcurl 函数 curl_global_init(CURL_GLOBAL_ALL); CURL* curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://www.feikua.net/home/browserApi/getClientIp"); curl_easy_perform(curl); curl_easy_cleanup(curl); } curl_global_cleanup(); // 关闭 libcurl 动态库 dlclose(handle); return 0; }
dlsym
是一个动态链接库函数,用于在运行时从共享库(动态库)中获取函数或变量的地址。在 C/C++ 等编程语言中,通常使用 dlopen
函数加载共享库,并使用 dlsym
函数来获取共享库中定义的函数或变量的地址,然后通过获取的地址来调用函数或操作变量。
dlsym
的原型如下:
void *dlsym(void *handle, const char *symbol);
handle
是由dlopen
返回的共享库句柄,表示已经加载的共享库。symbol
是要获取的函数或变量的名称,是一个字符串。
dlsym
函数通过指定共享库的句柄和函数或变量的名称,返回该函数或变量在共享库中的地址,然后可以将这个地址转换为对应的函数指针或变量指针,从而在程序中调用函数或访问变量。
这在动态加载共享库时非常有用,因为在编译时程序并不知道共享库中函数或变量的地址,只有在运行时加载共享库后,通过 dlsym
才能获取函数或变量的地址并进行使用。
总结来说,dlsym
允许你在运行时动态获取共享库中函数或变量的地址,使得你可以在程序运行过程中根据需要调用不同的函数或访问不同的变量。