对“main'”的未定义引用;collect2:错误:ld返回了1个退出状态
我正在尝试使用sqlite创建一个电话簿,我得到了编译错误,我能够调试一些语法错误,但是我现在遇到的问题是确保以下错误得到纠正对“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 <
/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,”代码>(和类似语句)零长度格式字符串无效