다른 라이브러리를 사용하고 싶은데 어떻게 하는거죠?

익명 사용자의 이미지

정말 기본적인건데 GTK 라이브러리라는 것을 사용해서 간단하게 g_timeout_add()라는 함수만 사용하고 싶은데 어떻게 해야하는지를 모르겠습니다. 리눅스에서 컴파일하면 헤더파일이 없다고 뜨는 것 같은데 어떻게 해야하나요?

raymundo의 이미지

헤더 파일 등 개발자를 위한 파일은 별개의 패키지로 제공하기도 합니다. ( 예를 들어 gtk 패키지는 사용자를 위한 라이브러리만, gtk-devel 패키지는 헤더 파일과 문서 등 )

헤더파일이 없다고 나오는 그 에러메시지를 그대로 복사해서 구글에 넣어보시면 누군가가 이미 질문을 했고 무슨 패키지를 설치하라는 답변도 있을 겁니다.

좋은 하루 되세요!

Hodong Kim@Google의 이미지

#include <gtk/gtk.h>
 
static int ref_count = 0;
static int interval = 1;
 
static gboolean
func (GtkLabel *label)
{
  gchar *text;
 
  text = g_strdup_printf ("interval: %d\nref_count: %d", interval, ref_count);
  gtk_label_set_text (label, text);
 
  g_free (text);
 
  g_atomic_int_inc (&ref_count);
  interval++;
 
  g_timeout_add_seconds (interval, (GSourceFunc) func, label);
 
  return G_SOURCE_REMOVE;
}
 
static void
activate (GtkApplication* app,
          gpointer        user_data)
{
  GtkWidget *window;
  GtkWidget *label;
 
  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "Window");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
  label = gtk_label_new ("Hello World");
  gtk_container_add (GTK_CONTAINER (window), label);
  gtk_widget_show_all (window);
  g_timeout_add_seconds (interval, (GSourceFunc) func, label);
}
 
int
main (int    argc,
      char **argv)
{
  GtkApplication *app;
  int status;
 
  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);
 
  return status;
}

컴파일 방법

hodong@debian:~$ gcc `pkg-config --cflags gtk+-3.0` -o example-0 example-0.c `pkg-config --libs gtk+-3.0`
hodong@debian:~$ ./example-0 

참고 자료

https://developer.gnome.org/gtk3/stable/gtk-getting-started.html

Hodong Kim@Google의 이미지

위에 ref_count 라는 변수는 예시입니다. 스레드에서는 저런 식으로 사용해야 하고,
g_atomic_int_inc 함수가 임계 영역을 설정해주기 때문에 별도로 뮤텍스를 사용하지 않습니다.
만약 g_atomic_int_inc 함수를 사용하지 않는다면 별도로 뮤텍스 락을 걸어줘야겠죠.

https://kldp.org/node/161741


전역변수 A를 클라이언트가 원할 때마다 1씩 증가시켜주는데 이 변수를 증가 요청한지 30분이 지날 때마다 1씩 감소시켜주고 싶습니다. 예를 들어서 이 변수를 5분, 5분, 10분 간격으로 증가시켰다면 감소시킬 때도 5분, 5분, 10분마다 한번씩 감소시켜주고 싶습니다. 어떻게 할 수 있을까요?

전역변수A가 ref_count 에 대응한다고 보면 되고,
5분, 10분이 interval 변수에 대응한다고 보시면 됩니다.
위 코드를 수정하셔서 사용하시면 되겠습니다.

Hodong Kim@Google의 이미지

#include <gtk/gtk.h>
 
static int ref_count = 0;
static int interval = 1;
 
static gboolean
decrease (GtkLabel *label)
{
  gchar *text;
 
  text = g_strdup_printf ("interval: %d\nref_count: %d", interval, ref_count);
  gtk_label_set_text (label, text);
 
  g_free (text);
 
  g_atomic_int_dec_and_test (&ref_count);
 
  return G_SOURCE_REMOVE;
}
 
static gboolean
increase (GtkLabel *label)
{
  gchar *text;
 
  text = g_strdup_printf ("interval: %d\nref_count: %d", interval, ref_count);
  gtk_label_set_text (label, text);
 
  g_free (text);
 
  g_atomic_int_inc (&ref_count);
 
  g_timeout_add_seconds (interval, (GSourceFunc) decrease, label);
 
  return G_SOURCE_REMOVE;
}
 
static void
activate (GtkApplication* app,
          gpointer        user_data)
{
  GtkWidget *window;
  GtkWidget *label;
 
  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "Window");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
  label = gtk_label_new ("Hello World");
  gtk_container_add (GTK_CONTAINER (window), label);
  gtk_widget_show_all (window);
  g_timeout_add_seconds (interval, (GSourceFunc) increase, label);
}
 
int
main (int    argc,
      char **argv)
{
  GtkApplication *app;
  int status;
 
  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);
 
  return status;
}
jick의 이미지

정말 질문 그대로 g_timeout_add()라는 함수 하나를 사용하기 위해 GTK를 링크하려고 하시는 거라면...

...하지 마세요. 하는 순간 끝없는 삽질과 "어 왜 내 컴퓨터에서는 되는데 저 컴퓨터에서는 안되지?" 하고 머리를 부여잡고 괴로워하는 상황을 만나게 될 것입니다.

이건 좀 오버해서 비유하자면 "제가 저녁으로 상추쌈을 먹고 싶은데 지나가다 보니 옆동네에 상추밭 500평짜리가 매물로 나왔더군요, 부동산 거래는 첨인데 어떻게 하면 되죠?" 이런 식의 이야기입니다. (..음 좀 심했나.. -.-)

원하는 기능을 어떻게 구현하면 되는지 C/C++에서 쓰레드 사용법을 익힌 다음에 직접 짜세요. 그편이 예상되는 삽질의 총량을 최소 10분의 1로 줄여줄 겁니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.