Mac libcurl 使用例子

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章