c - 使用 g_rename 函数编译 GTK+ 应用程序时出错

标签 c linux ubuntu gtk

我正在尝试使用 g_rename,编译器给我一个奇怪的消息 error: called object ‘rename’ is not a function for line in code

if (g_rename(old_file_name, full_new_file_name) == -1)

我不明白为什么。

我正在用命令编译

cc -Wall -g `pkg-config --cflags --libs gtk+-2.0` app.c -o app

Gcc 版本 = gcc (Ubuntu 4.4.1-4ubuntu8) 4.4.1

Gtk+ 版本 = 2.18.3-1ubuntu


完整代码如下:

#include <gtk/gtk.h>
#include <string.h>
#include <glib.h>
#include <glib/gstdio.h>

void
destroy (GtkWidget*, gpointer);
void
file_chooser_file_set(GtkWidget*, gpointer);

void
rename_clicked(GtkWidget*, gpointer);

int main (int argc, char* argv[]){
  GtkWidget *window, *vbox, *hbox, *rename, *text_rename, *file_chooser;

  gtk_init (&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "File renamer");
  g_signal_connect(G_OBJECT(window),
                    "destroy",
                    G_CALLBACK(destroy),
                    NULL);

  vbox = gtk_vbox_new(FALSE, 5);

  file_chooser = gtk_file_chooser_button_new("Choose file to rename:", GTK_FILE_CHOOSER_ACTION_OPEN);
  g_signal_connect(G_OBJECT(file_chooser),
                    "file-set",
                    G_CALLBACK(file_chooser_file_set),
                    NULL);

  gtk_box_pack_start(GTK_BOX(vbox),
                      GTK_WIDGET(file_chooser),
                      TRUE,
                      FALSE,
                      5);

  hbox = gtk_hbox_new(FALSE, 5);

  rename = gtk_button_new_with_label("Rename");

  gtk_box_pack_end(GTK_BOX(hbox),
                      GTK_WIDGET(rename),
                      FALSE,
                      FALSE,
                      5);

  text_rename = gtk_entry_new();
  g_signal_connect(G_OBJECT(rename),
                    "clicked",
                    G_CALLBACK(rename_clicked),
                    text_rename);
  gtk_box_pack_start(GTK_BOX(hbox),
                      GTK_WIDGET(text_rename),
                      TRUE,
                      TRUE,
                      5);

  gtk_box_pack_start(GTK_BOX(vbox),
                      GTK_WIDGET(hbox),
                      FALSE,
                      FALSE,
                      5);

  gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(vbox));
  gtk_widget_show_all(GTK_WIDGET(window));

  g_object_set_data(G_OBJECT(file_chooser),
                    "text_rename",
                    (gpointer) text_rename);
  g_object_set_data(G_OBJECT(file_chooser),
                    "rename",
                    (gpointer) rename);

  g_object_set_data(G_OBJECT(rename),
                    "file_chooser",
                    (gpointer)file_chooser);
  gtk_main();

  return 0;
}

#define _CHECK_FATAL_ERROR( e )\
  if ( (e) ) { \
    g_error("Fatal error: %s", (e)->message); \
    g_error_free( (e) );\
  }

#define _PATH_BUFFER_LENGTH 200
void
rename_clicked(GtkWidget* rename, gpointer text_entry) {
  gchar *new_file_name;
  gchar *old_file_name;
  gchar *full_new_file_name = g_new0(gchar, _PATH_BUFFER_LENGTH);
  GtkFileChooserButton *file_chooser;

  GError *error = NULL;

  GRegex *remove_file_name;

  remove_file_name = g_regex_new("/[^/]+$",
                                0,
                                0,
                                &error);
  _CHECK_FATAL_ERROR( error );


  file_chooser = GTK_FILE_CHOOSER_BUTTON(g_object_get_data(G_OBJECT(rename), "file_chooser"));

  new_file_name = g_strdup( gtk_entry_get_text(GTK_ENTRY(text_entry)) );
  old_file_name = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_chooser)));
  if ( !( new_file_name && old_file_name ) )
    g_error("Error while allocating memory!");

  /*BEGIN*/
  /* full_new_file_name = dirname( old_file_name ) . new_file_name */
    gchar *path;

    path = g_regex_replace(remove_file_name,
                            old_file_name,
                            strlen(old_file_name),
                            0,
                            "/",
                            0,
                            &error);
    _CHECK_FATAL_ERROR( error );

    //Path
    full_new_file_name[0] = 0;
    g_strlcat(full_new_file_name, path, _PATH_BUFFER_LENGTH);
    //name
    g_strlcat(full_new_file_name, new_file_name, _PATH_BUFFER_LENGTH);
//    g_print("Full file name: %s\n", full_new_file_name);
    g_free( path );
  /*END*/

  if (g_rename(old_file_name, full_new_file_name) == -1)
    g_error("Error while renaming %s to %s", old_file_name, full_new_file_name);

  gtk_widget_set_sensitive(GTK_WIDGET(rename), FALSE);
  gtk_widget_set_sensitive(GTK_WIDGET(text_entry), FALSE);

  g_free( new_file_name );
  g_free( full_new_file_name );
  g_free( old_file_name );
  g_regex_unref( remove_file_name );
}

void
file_chooser_file_set(GtkWidget* file_chooser, gpointer null) {
  GtkButton *rename;
  GtkEntry  *text_rename;

  rename      = GTK_BUTTON(g_object_get_data(G_OBJECT(file_chooser),
                                             "rename") );
  text_rename = GTK_ENTRY(g_object_get_data(G_OBJECT(file_chooser),
                                            "text_rename"));

  gtk_widget_set_sensitive(GTK_WIDGET(rename), TRUE);
  gtk_widget_set_sensitive(GTK_WIDGET(text_rename), TRUE);
}

void destroy (GtkWidget* widget, gpointer data) {
  gtk_main_quit();
}

最佳答案

首先,您需要在您的机器上安装 libgtk2.0-dev 和 glibc-dev。 在 Unix 系统上 g_rename默认情况下是 C 库函数的别名 rename . 你需要#include <stdio.h>能够使用重命名功能而不会出现该错误。您所看到的实际上是 gstdio.h 头文件中的错误,该文件应该为您包含 stdio.h。

关于c - 使用 g_rename 函数编译 GTK+ 应用程序时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2196439/

相关文章:

objective-c - C 类型变量的 Objective C 反射

mysql - 运行mysql时清空unix终端

linux - Linux CFS 调度程序代码在哪里?

c++ - 警告 : GDB: Failed to set controlling terminal: Operation not permitted

php - 当 "--width"=> 1140 时使用 wkhtmltoimage 的超大图像

objective-c - Objective-C - 在 C 或 Objective-C 中定义

C:删除新行/空终止输入字符串

c++ - 是否可以防止信号凝聚?

用于启动/关闭 jboss7 的 shell 脚本失败并出现 "Unexpected end of file"语法错误

c - 当数组格式如下时,如何将二维数组传递给 C 中的函数?