未明确引用`main' collect2:错误:ld返回1退出状态

时间:2017-12-09 01:31:06

标签: c sqlite gcc

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

#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);
 }
}
}
}

我将很感激地解释错误并提供一些解决方案

gcc insertno.c -o insertno -lsqlite3

当我使用

在putty上编译这个c代码时
/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):

我在下面收到此错误,非常感谢解决方案。谢谢

{{1}}

1 个答案:

答案 0 :(得分:3)

您的函数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

GCC在callback()函数中遇到函数定义时没有标记错误的原因是GCC有一个名为nested functions的扩展名。

相关问题