对“main'”的未定义引用;collect2:错误:ld返回了1个退出状态

对“main'”的未定义引用;collect2:错误:ld返回了1个退出状态,c,sqlite,gcc,C,Sqlite,Gcc,我正在尝试使用sqlite创建一个电话簿,我得到了编译错误,我能够调试一些语法错误,但是我现在遇到的问题是确保以下错误得到纠正 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: In function `_start': (.text+0x20): 我将感谢解释错误并提供一些解决方案 #include <stdio.h> #include <stdlib.h> #include <

我正在尝试使用sqlite创建一个电话簿,我得到了编译错误,我能够调试一些语法错误,但是我现在遇到的问题是确保以下错误得到纠正

/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20):
我将感谢解释错误并提供一些解决方案

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   int i;
   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("...................................................\n");
   return 0;

int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   const char* data = "Callback function called";


if (argc == 3 && (0 == strcmp(argv[1], "-f"))) {
    if(argc == 1){

   rc = sqlite3_open("test.db", &db);
     if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
   /* Create SQL statement */
   sql = "CREATE TABLE CONTACTS("  \
         "ID INT PRIMARY KEY     NOT NULL," \
         "FIRSTNAME      TEXT    NOT NULL," \
         "LASTNAME       TEXT    NOT NULL," \
         "MOBILEPHONE       TEXT    NOT NULL," \
         "CITY            TEXT     NOT NULL," \
         "ADDRESS        CHAR(50)," \
         "COUNTRY         TEXT );";

   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
   if( rc != SQLITE_OK ){
   fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Table created successfully\n");
   }
   sqlite3_close(db);
   return 0;
  }
 }
 }
}
void MainMenu()
{
        int optn; // option value
        int valid; //check if option is valid
        system("clear");
      valid = 0;
        while( valid == 0 )
       {
       printf("---------------DELIMITER---------------\n");
       printf("Phone book Menu\n");
       printf("(1) Add new record to phone book\n");
       printf("(2) Search phone book\n");
       printf("(3) Update phone book\n");
       printf("(4) Delete record from phone book\n");
       printf("(5) Quit\n");
       printf("---------------DELIMITER---------------\n");
       printf("Please choose your operation: ");

                if(scanf("%d", &optn) == 1)
                {
                        if(optn > 0 && optn < 6)
                        {
                                valid = 1;
                        }else{
                                printf("Error: Invalid option selected, please try again\n\n");
                }

        }
        //start the operations
        if(optn == 1)
        {
            AddMenu();
        }else if (optn == 2)
        {

                SearchMenu();
        }else if (optn == 3)
        {
                UpdateMenu();
        }else if (optn == 4)
        {
                DeleteMenu();
        }else{
                exit(0);
        }
    }
}
//search menu
void SearchMenu()
{
        int optn; // option value
        int valid; //check if option is valid
        int display_search; //allow csv file export
        char ch; //repeat option value
        sqlite3 *db;
        char *zErrMsg = 0;
         int rc;
         char *sql;
         const char* data;

        printf("\tSearch PhoneBook\n");
        printf("================================\n\n");
        valid = 0;
        while( valid == 0 )
        {
                printf("Select a search option:\n");
                printf("-----------------------\n");
                printf(" 1) Display search result\n");
                printf(" 2) Back\n\n");
                printf("Choose an option: ");

                if(scanf("%d", &optn) == 1)
                {
                        if(optn > 0 && optn < 3)
                        {
                                valid = 1;
                        }else{
                                printf("Error: Invalid option selected, please try again\n\n");
                        }
                }
        //start the operations
        if(optn == 1)
        {
         sql = "SELECT * from CONTACTS";

   /* Execute SQL statement */
        rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
  if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return;
  }

}

}
void AddMenu()
{
char *sql;
        char statement[512];
        char *fname = malloc(50);
        char *lname = malloc(50);
        char *city= malloc(50);
        char *country= malloc(50);
        sqlite3 *db;
        char *zErrMsg = 0;
         int rc;
        printf("Enter the First Name: ");
        scanf("%[^\n]s", fname);


        printf("Enter the Last Name: ");
        scanf("%[^\n]s", lname);


        printf("Enter the Mobile Phone: ");
        scanf("%[^\n]s", mobile);

        printf("Enter the City: ");
        scanf("%[^\n]s", city);

          printf("Enter the Country: ");
        scanf("%[^\n]s", country);

     //run SQL Statements

        sql = "INSERT INTO CONTACT (FirstName,LastName,MobilePhone,City,Country) "  \
         "VALUES ('%s','%s','%s','%s','%s' );";

   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);

   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Records created successfully\n");
   }
   sqlite3_close(db);
   return;
}
void UpdateMenu()
{
char id;
int valid;
char *fname = malloc(50);
char *lname = malloc(50);
char *mobile= malloc(20);
char *city= malloc(50);
char *country= malloc(50);
char statement[512];
char values_cut[512];
char fname_out[50];
char lname_out[50];
char mobile_out[20];
char city_out[50];
char country_out[50];
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
const char* data;

if(do_search(0) == 0){

        valid = 0;
        while( valid == 0 )
        {
                printf("Enter the Number you want to update: ");

                if(scanf("%s", &id) == 1)
                        {
                                if(id > 0 )
                                {
                                        valid = 1;

                                        printf("\nUpdate the values, press enter if you do not want to change a field\n");
                                        printf("---------------------------------------------------------------------\n");

                                        //get the update values
                                        printf("Enter the First Name: ");
                                        if((scanf("%[^\n]s", fname) != 0)){
                                                snprintf(fname_out, sizeof fname_out, "FirstName='%s',",fname);
                                        }else{
                                                snprintf(fname_out,sizeof fname_out, "");
                                        }
                                        fname = fname_out;


                                        printf("Enter the Last Name: ");
                                        if((scanf("%[^\n]s", lname)!=0)){
                                                snprintf(lname_out,sizeof lname_out, "LastName='%s',",lname);
                                        }else{
                                                snprintf(lname_out,sizeof lname_out, "");
                                        }
                                        lname=lname_out;


                                     printf("Enter the Mobile Phone: ");
                                        if((scanf("%[^\n]s", mobile)!=0)){
                                                snprintf(mobile_out,sizeof mobile_out, "MobilePhone='%s',",mobile);
                                        }else{
                                                snprintf(mobile_out,sizeof mobile_out, "");
                                        }
                                        mobile=mobile_out;


                                        printf("Enter the City: ");
                                        if((scanf("%[^\n]s", city)!=0)){
                                                snprintf(city_out,sizeof city_out, "City='%s',",city);
                                        }else{
                                                snprintf(city_out,sizeof city_out, "");
                                        }
                                        city=city_out;


                                        printf("Enter the Country: ");
                                        if((scanf("%[^\n]s", country)!=0)){
                                                snprintf(country_out,sizeof country_out, "Country='%s',",country);
                                                                   }else{
                                                snprintf(country_out,sizeof country_out, "");
                                        }
                                        country=country_out;


                                        //remove the last comma from the query
                                        snprintf(values_cut,sizeof values_cut, "%s%s%s%s%s",fname,lname,mobile,city,country);

                                                }
                                        }

/* Create merged SQL statement */
   sql = "UPDATE CONTACT set %s where ID=%s";
         "SELECT * from CONTACT  where ID=%s";

   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);

   if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return;
}

}


}
//Delete menu
void DeleteMenu()
{
        int valid;
        int id, good;
        char *sql;
        char statement[512];
        sqlite3 *db;
        char *zErrMsg = 0;
        int rc;
        const char* data;
        int optn;
        //search first
        if(do_search(0)==0){

        valid = 0;
        while( valid == 0 )
        {
                printf("Enter the number you want to delete: ");

                if(scanf("%s", &id) == 1)
                        {
                                if(id > 0 )
                                {
                                        valid = 1;
/* Create merged SQL statement */
   sql = "DELETE from CONTACT where ID=%s; " \
         "SELECT * from CONTACT";

   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);

   if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return;
      }
   }while(optn!=5);
 }
}
}
}

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   int i;
   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("...................................................\n");
   return 0;

int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   const char* data = "Callback function called";


if (argc == 3 && (0 == strcmp(argv[1], "-f"))) {
    if(argc == 1){

   rc = sqlite3_open("test.db", &db);
     if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
   /* Create SQL statement */
   sql = "CREATE TABLE CONTACTS("  \
         "ID INT PRIMARY KEY     NOT NULL," \
         "FIRSTNAME      TEXT    NOT NULL," \
         "LASTNAME       TEXT    NOT NULL," \
         "MOBILEPHONE       TEXT    NOT NULL," \
         "CITY            TEXT     NOT NULL," \
         "ADDRESS        CHAR(50)," \
         "COUNTRY         TEXT );";

   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
   if( rc != SQLITE_OK ){
   fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Table created successfully\n");
   }
   sqlite3_close(db);
   return 0;
  }
 }
 }
}
void MainMenu()
{
        int optn; // option value
        int valid; //check if option is valid
        system("clear");
      valid = 0;
        while( valid == 0 )
       {
       printf("---------------DELIMITER---------------\n");
       printf("Phone book Menu\n");
       printf("(1) Add new record to phone book\n");
       printf("(2) Search phone book\n");
       printf("(3) Update phone book\n");
       printf("(4) Delete record from phone book\n");
       printf("(5) Quit\n");
       printf("---------------DELIMITER---------------\n");
       printf("Please choose your operation: ");

                if(scanf("%d", &optn) == 1)
                {
                        if(optn > 0 && optn < 6)
                        {
                                valid = 1;
                        }else{
                                printf("Error: Invalid option selected, please try again\n\n");
                }

        }
        //start the operations
        if(optn == 1)
        {
            AddMenu();
        }else if (optn == 2)
        {

                SearchMenu();
        }else if (optn == 3)
        {
                UpdateMenu();
        }else if (optn == 4)
        {
                DeleteMenu();
        }else{
                exit(0);
        }
    }
}
//search menu
void SearchMenu()
{
        int optn; // option value
        int valid; //check if option is valid
        int display_search; //allow csv file export
        char ch; //repeat option value
        sqlite3 *db;
        char *zErrMsg = 0;
         int rc;
         char *sql;
         const char* data;

        printf("\tSearch PhoneBook\n");
        printf("================================\n\n");
        valid = 0;
        while( valid == 0 )
        {
                printf("Select a search option:\n");
                printf("-----------------------\n");
                printf(" 1) Display search result\n");
                printf(" 2) Back\n\n");
                printf("Choose an option: ");

                if(scanf("%d", &optn) == 1)
                {
                        if(optn > 0 && optn < 3)
                        {
                                valid = 1;
                        }else{
                                printf("Error: Invalid option selected, please try again\n\n");
                        }
                }
        //start the operations
        if(optn == 1)
        {
         sql = "SELECT * from CONTACTS";

   /* Execute SQL statement */
        rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
  if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return;
  }

}

}
void AddMenu()
{
char *sql;
        char statement[512];
        char *fname = malloc(50);
        char *lname = malloc(50);
        char *city= malloc(50);
        char *country= malloc(50);
        sqlite3 *db;
        char *zErrMsg = 0;
         int rc;
        printf("Enter the First Name: ");
        scanf("%[^\n]s", fname);


        printf("Enter the Last Name: ");
        scanf("%[^\n]s", lname);


        printf("Enter the Mobile Phone: ");
        scanf("%[^\n]s", mobile);

        printf("Enter the City: ");
        scanf("%[^\n]s", city);

          printf("Enter the Country: ");
        scanf("%[^\n]s", country);

     //run SQL Statements

        sql = "INSERT INTO CONTACT (FirstName,LastName,MobilePhone,City,Country) "  \
         "VALUES ('%s','%s','%s','%s','%s' );";

   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);

   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Records created successfully\n");
   }
   sqlite3_close(db);
   return;
}
void UpdateMenu()
{
char id;
int valid;
char *fname = malloc(50);
char *lname = malloc(50);
char *mobile= malloc(20);
char *city= malloc(50);
char *country= malloc(50);
char statement[512];
char values_cut[512];
char fname_out[50];
char lname_out[50];
char mobile_out[20];
char city_out[50];
char country_out[50];
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
const char* data;

if(do_search(0) == 0){

        valid = 0;
        while( valid == 0 )
        {
                printf("Enter the Number you want to update: ");

                if(scanf("%s", &id) == 1)
                        {
                                if(id > 0 )
                                {
                                        valid = 1;

                                        printf("\nUpdate the values, press enter if you do not want to change a field\n");
                                        printf("---------------------------------------------------------------------\n");

                                        //get the update values
                                        printf("Enter the First Name: ");
                                        if((scanf("%[^\n]s", fname) != 0)){
                                                snprintf(fname_out, sizeof fname_out, "FirstName='%s',",fname);
                                        }else{
                                                snprintf(fname_out,sizeof fname_out, "");
                                        }
                                        fname = fname_out;


                                        printf("Enter the Last Name: ");
                                        if((scanf("%[^\n]s", lname)!=0)){
                                                snprintf(lname_out,sizeof lname_out, "LastName='%s',",lname);
                                        }else{
                                                snprintf(lname_out,sizeof lname_out, "");
                                        }
                                        lname=lname_out;


                                     printf("Enter the Mobile Phone: ");
                                        if((scanf("%[^\n]s", mobile)!=0)){
                                                snprintf(mobile_out,sizeof mobile_out, "MobilePhone='%s',",mobile);
                                        }else{
                                                snprintf(mobile_out,sizeof mobile_out, "");
                                        }
                                        mobile=mobile_out;


                                        printf("Enter the City: ");
                                        if((scanf("%[^\n]s", city)!=0)){
                                                snprintf(city_out,sizeof city_out, "City='%s',",city);
                                        }else{
                                                snprintf(city_out,sizeof city_out, "");
                                        }
                                        city=city_out;


                                        printf("Enter the Country: ");
                                        if((scanf("%[^\n]s", country)!=0)){
                                                snprintf(country_out,sizeof country_out, "Country='%s',",country);
                                                                   }else{
                                                snprintf(country_out,sizeof country_out, "");
                                        }
                                        country=country_out;


                                        //remove the last comma from the query
                                        snprintf(values_cut,sizeof values_cut, "%s%s%s%s%s",fname,lname,mobile,city,country);

                                                }
                                        }

/* Create merged SQL statement */
   sql = "UPDATE CONTACT set %s where ID=%s";
         "SELECT * from CONTACT  where ID=%s";

   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);

   if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return;
}

}


}
//Delete menu
void DeleteMenu()
{
        int valid;
        int id, good;
        char *sql;
        char statement[512];
        sqlite3 *db;
        char *zErrMsg = 0;
        int rc;
        const char* data;
        int optn;
        //search first
        if(do_search(0)==0){

        valid = 0;
        while( valid == 0 )
        {
                printf("Enter the number you want to delete: ");

                if(scanf("%s", &id) == 1)
                        {
                                if(id > 0 )
                                {
                                        valid = 1;
/* Create merged SQL statement */
   sql = "DELETE from CONTACT where ID=%s; " \
         "SELECT * from CONTACT";

   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);

   if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return;
      }
   }while(optn!=5);
 }
}
}
}
我在下面得到了这个错误,非常感谢您的解决方案。谢谢

/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20):
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20):

函数体
callback()
未正确关闭

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   int i;
   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("...................................................\n");
   return 0;
} // THIS WAS MISSING
静态int回调(void*NotUsed,int argc,char**argv,char**azColName){
int i;

对于(i=0;i.

函数体
callback()
未正确关闭

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   int i;
   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("...................................................\n");
   return 0;
} // THIS WAS MISSING
静态int回调(void*NotUsed,int argc,char**argv,char**azColName){
int i;

对于(i=0;i.

如果您想要一个关于GCC扩展为何有害的论点,那么大量的代码就是一个很好的案例研究。它应该需要明确的启用(例如
-fnested函数
);默认情况下不应启用它。如果您想知道GCC扩展有害的原因,那么大量的代码就是一个很好的案例研究。它应该需要显式启用(例如,
-fnested functions
);默认情况下不应启用它。此函数:
callback()
缺少尾随的右大括号'}“`您的编译器应该告诉您这一点。在编译时,始终启用警告,然后修复这些警告。(对于
gcc
,至少使用:
-Wall-Wextra-Wconversion-pedantic-std=gnu11
)将发布的代码传递给编译器时,会产生一长串警告和错误消息。为了便于阅读和理解:1)一致地缩进代码。在每个开始大括号“{”之后缩进。在每个结束大括号“}”之前取消缩进,建议每个缩进级别为4个空格。2)单独的代码块(for、if、else、while、do…while、switch、case、default)通过一个空行。3)用2或3个空行分隔函数(保持一致)。4)遵循公理:每行只有一条语句,并且(最多)每条语句有一个变量声明。变量(和参数)名称应指示
内容
用法
关于:
snprintf(fname\u out,sizeof fname\u out,”;
(和类似语句)零长度格式字符串无效此函数:
callback()
缺少尾随的右大括号“}“`您的编译器应该告诉您这一点。在编译时,始终启用警告,然后修复这些警告。(对于
gcc
,至少使用:
-Wall-Wextra-Wconversion-pedantic-std=gnu11
)将发布的代码传递给编译器时,会产生一长串警告和错误消息。为了便于阅读和理解:1)一致地缩进代码。在每个左大括号“{”之后缩进。在每个右大括号“}”之前取消缩进,建议每个缩进级别为4个空格。2) 通过单个空行分隔代码块(用于、if、else、while、do…while、switch、case、default)。3) 用2或3个空行分隔功能(保持一致)。4) 遵循公理:每行只有一条语句,每个语句(最多)有一个变量声明。变量(和参数)名称应表示
内容
用法
(或两者都更好)。关于:
snprintf(fname\u out,sizeof fname\u out,”(和类似语句)零长度格式字符串无效