#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
允許你在運行時動態獲取共享庫中函數或變量的地址,使得你可以在程序運行過程中根據需要調用不同的函數或訪問不同的變量。