编译 Curl 和 GTK

Compiling Curl and GTK

当我编译以下代码时

#include <gtk/gtk.h>
#include <curl/curl.h>
#include <iostream>
#include <string>

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

void pop_class()
{
    CURL *curl;
    CURLcode res;
    std::string readBuffer;

    curl = curl_easy_init();

    if(curl) 
    {
        curl_easy_setopt(curl, CURLOPT_URL, "http://api.openweathermap.org/data/2.5/forecast id=2158867&appid=a4f247bfd153738d2cd1757224361972");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }

}

int main(int argc, char *argv[])
{
    GtkBuilder      *builder; 
    GtkWidget       *window;

    gtk_init(&argc, &argv);

    builder = gtk_builder_new_from_file("glade/window_main.glade");

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));
    gtk_builder_connect_signals(builder, NULL);

    g_object_unref(builder);

    gtk_widget_show(window);                
    gtk_main();

    pop_class();

    return 0;
}

// called when window is closed
void on_window_main_destroy()
{
    gtk_main_quit();
}

使用以下命令,

g++ -c -g -O0 -Wall -pthread -pipe src/main.cpp -lcurl `pkg-config --cflags --libs gtk+-3.0` -o main.o

我收到此警告:

src/main.cpp: In function ‘void pop_class()’:
src/main.cpp:15:11: warning: variable ‘res’ set but not used [-Wunused-but-set-variable]
   15 |  CURLcode res;

然后用

编译目标文件
g++ -o temp_app main.o -pthread `pkg-config --cflags --libs gtk+-3.0` -export-dynamic

我收到以下错误:

/usr/bin/ld: main.o: in function `pop_class()':
/home/carl/project/template/src/main.cpp:18: undefined reference to `curl_easy_init'
/usr/bin/ld: /home/carl/project/template/src/main.cpp:22: undefined reference to `curl_easy_setopt'
/usr/bin/ld: /home/carl/project/template/src/main.cpp:23: undefined reference to `curl_easy_setopt'
/usr/bin/ld: /home/carl/project/template/src/main.cpp:24: undefined reference to `curl_easy_setopt'
/usr/bin/ld: /home/carl/project/template/src/main.cpp:25: undefined reference to `curl_easy_perform'
/usr/bin/ld: /home/carl/project/template/src/main.cpp:26: undefined reference to `curl_easy_cleanup'

你所有的错误似乎都与 curl 有关的原因是你忘记在你的第二个命令中告诉编译器 link 它。

换句话说:

g++ -o temp_app main.o -pthread `pkg-config --cflags --libs gtk+-3.0` -export-dynamic

应该变成

g++ -o temp_app main.o -pthread -lcurl `pkg-config --cflags --libs gtk+-3.0` -export-dynamic