struct — Ошибки при компоновке и компиляции файлов C ++ с использованием TextPad / G ++, возможно (возможно) просто синтаксис?

Это вполне может быть синтаксической ошибкой с моей стороны, так как я довольно новичок в использовании нескольких файлов и структур в C ++ (в частности, передача структур в функции). Вот три файла:

main.cpp:

#include <iostream>
#include <fstream>
#include <string>
#include "common.h"using namespace std;

void honorStatus(int, student studentList[]);

int main(void)
{
int header;
string filename;
ifstream inputFile;
student studentList[MAX_STUDENTS];

// Get filename from user and try to open file
cout << "Please enter a filename: ";
cin >> filename;

inputFile.open(filename.c_str());

// If file cannot be opened, output error message and close program
if (inputFile.fail())
{
cout << "Input file could not be opened. Please try again." << endl;
return 1;
}

// Get header number from file. If header is larger than max number
// of students, error is output and program is closed
inputFile >> header;
if (header > MAX_STUDENTS)
{
cout << "Number of students has exceeded maximum of " << MAX_STUDENTS
<< ". Please try again." << endl;
return 1;
}

// Read file information (student ID, hours, and GPA) into struct array
for (int i = 0; i < header; i++)
{
inputFile >> studentList[i].ID >> studentList[i].hours >> studentList[i].GPA;
}

// Close the file
inputFile.close();

// Calls function honorStatus
honorStatus(header, studentList);

return 0;
}

functs.cpp:

#include <iostream>
#include "common.h"using namespace std;

// Function to determine classification and honors society eligibility requirements
// of each student, outputting this information and the number of students eligible
void honorStatus(int fheader, student fstudentList[])
{
int cnt = 0;

for (int i = 0; i < fheader; i++)
{
if (fstudentList[i].hours < 30)
{
cout << "Student #" << fstudentList[i].ID << " is a freshman with GPA of "<< fstudentList[i].GPA << ".    Not eligible." << endl;
}
else if (fstudentList[i].hours > 29 && fstudentList[i].hours < 60)
{
if (fstudentList[i].GPA >= 3.75)
{
cout << "Student #" << fstudentList[i].ID << " is a sophomore with GPA of "<< fstudentList[i].GPA << ".    Eligible." << endl;
cnt++;
}
else
{
cout << "Student #" << fstudentList[i].ID << " is a sophomore with GPA of "<< fstudentList[i].GPA << ".    Not Eligible." << endl;
}
}
else if (fstudentList[i].hours > 59 && fstudentList[i].hours < 90)
{
if (fstudentList[i].GPA >= 3.5)
{
cout << "Student #" << fstudentList[i].ID << " is a junior with GPA of "<< fstudentList[i].GPA << ".    Eligible." << endl;
cnt++;
}
else
{
cout << "Student #" << fstudentList[i].ID << " is a junior with GPA of "<< fstudentList[i].GPA << ".    Not eligible." << endl;
}
}
else
{
if (fstudentList[i].GPA >= 3.25)
{
cout << "Student #" << fstudentList[i].ID << " is a senior with GPA of "<< fstudentList[i].GPA << ".    Eligible." << endl;
cnt++;
}
else
{
cout << "Student #" << fstudentList[i].ID << " is a senior with GPA of "<< fstudentList[i].GPA << ".    Not eligible." << endl;
}
}
}

cout << "\nTotal number of students eligible for the Honor Society is " << cnt << "." << endl;
}

common.h:

// Maximum number of students allowed
const int MAX_STUDENTS = 10;

// Struct for student info
struct student
{
int ID;
int hours;
float GPA;
};

При использовании TextPad / G ++ я получаю следующую ошибку:

/cygdrive/c/Users/Korina/AppData/Local/Temp/ccxq9DAh.o:p7b.cpp:(.text+0x0): multiple definition of `main'
/cygdrive/c/Users/Korina/AppData/Local/Temp/ccmtzOP2.o:p5.cpp:(.text+0x0): first defined here
/cygdrive/c/Users/Korina/AppData/Local/Temp/ccLa96oD.o:test.cpp:(.text+0x0): multiple definition of `main'
/cygdrive/c/Users/Korina/AppData/Local/Temp/ccmtzOP2.o:p5.cpp:(.text+0x0): first defined here
/usr/lib/gcc/i686-pc-cygwin/4.8.2/../../../../i686-pc-cygwin/bin/ld: /cygdrive/c/Users/Korina/AppData/Local/Temp/ccmtzOP2.o: bad reloc address 0x1b in section `.text$_ZNSt11char_traitsIcE7compareEPKcS2_j[__ZNSt11char_traitsIcE7compareEPKcS2_j]'
collect2: error: ld returned 1 exit status

При использовании онлайн-компилятора C ++ (CompileOnline) я получаю:

/tmp/ccIMwHEt.o: In function `main':
main.cpp:(.text+0x1cf): undefined reference to `honorStatus(int, student*)'
collect2: error: ld returned 1 exit status

Я не смог найти руководство по настройке TextPad / G ++ для компиляции и связывания нескольких файлов, но мой инструктор дал небольшой набор инструкций, которым я следовал. Вот как это настроено:

TextPad / G ++ Multiple File Compile

Так что это может быть двухсторонний вопрос (как настроить TextPad для правильной компиляции / компоновки файлов? Почему мой honorStatus() функция не определена в main.cpp?) или это может быть просто из-за неправильного синтаксиса. Я честно не уверен. Извините, если это немного долго; Я хотел включить как можно больше деталей. Любая помощь с благодарностью.

0

Решение

Проблема в том, что вы компилируете «* .cpp» все вместе. Учитывая это

/cygdrive/c/Users/Korina/AppData/Local/Temp/ccxq9DAh.o:p7b.cpp:(.text+0x0): multiple definition of `main'
/cygdrive/c/Users/Korina/AppData/Local/Temp/ccmtzOP2.o:p5.cpp:(.text+0x0): first defined here
/cygdrive/c/Users/Korina/AppData/Local/Temp/ccLa96oD.o:test.cpp:(.text+0x0): multiple definition of `main'
/cygdrive/c/Users/Korina/AppData/Local/Temp/ccmtzOP2.o:p5.cpp:(.text+0x0): first defined here
/usr/lib/gcc/i686-pc-cygwin/4.8.2/../../../../i686-pc-cygwin/bin/ld: /cygdrive/c/Users/Korina/AppData/Local/Temp/ccmtzOP2.o: bad reloc address 0x1b in section `.text$_ZNSt11char_traitsIcE7compareEPKcS2_j[__ZNSt11char_traitsIcE7compareEPKcS2_j]'
collect2: error: ld returned 1 exit status

мы можем видеть, что компилятор пытается объединить p5.cpp, p7b.cpp и test.cpp в один исполняемый файл (возможно, и другие файлы .cpp тоже).

Вы должны точно указать компилятору, какие именно файлы вы хотите собрать вместе для одной программы. Например.

g++ main.cpp functs.cpp -o main.exe

(Я бы предложил также добавить -Wall -Wextra -Werror в строку компиляции, так как это позволяет компилятору обнаруживать небольшие ошибки, которые не являются строго ошибками, но в которых вы, вероятно, что-то не так)

3

Другие решения

Из вывода компоновщика вы можете увидеть, что main Функция находится в этих файлах: p7b.cpp, p5.cpp а также test.cpp, Как нет main.cpp файл, указанный в выводе компоновщика, я думаю, что текущий каталог настроен на p7b.cpp и другие файлы находятся.

Попробуй поменять Initial Folder быть там, где твой main.cpp файл установлен (что-то вроде /cygdrive/c/Users/Korina/programming/). Кроме того, удалите все ненужные файлы из этого каталога, так как вы собираете все cpp файлы.

1

Сообщение об ошибке достаточно ясно. Ваш проект содержит следующие файлы

p7b.cpp, p5.cpp, test.cpp

где в каждом файле определена функция main. Поместите место в порядке с вашими файлами проекта.

Что касается сообщения об ошибке, когда вы используете встроенный компилятор, то кажется, что модуль functs.cpp не включен в проект. Таким образом, компилятор не видит определение функции.

1
По вопросам рекламы [email protected]