So I am developing a project and I am almost at the end. I am working with 3 files: main.cpp, game.h, game.cpp . I used header files because it was told to me that it was good practice. However, I am having some issues and problems compiling and building the project in vscode. When including the corresponding .cpp file (#include "game.cpp") the ide recognises all functions, builds the project and runs it with no probs at all, but when I try including the header file (#include "game.h") the console displays a message saying that it hasn't found any function called in the main.cpp file. I have tried to look up this issue in various websites and forums, tried cmake, modifying c_cpp_properties.json and tasks.json files and I haven't solved this issue yet. Either I am doing something wrong (which is very likely given that I am still a beginner) or there's something wrong that I am not aware of.
I'd like to add that, for running and compiling "normal" .cpp files I am using the CodeRunner extension and to debug I use gcc/gdb.
Console output:
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\zebar\AppData\Local\Temp\ccjgUQbH.o:main.cpp:(.text+0xe): undefined reference to `menu()'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\zebar\AppData\Local\Temp\ccjgUQbH.o:main.cpp:(.text+0x30): undefined reference to `ReadRules()'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\zebar\AppData\Local\Temp\ccjgUQbH.o:main.cpp:(.text+0x4a): undefined reference to `play()'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\zebar\AppData\Local\Temp\ccjgUQbH.o:main.cpp:(.text+0x64): undefined reference to `leaderboard()'
collect2.exe: error: ld returned 1 exit status
My c_cpp_properties.json:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.19041.0",
"compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.28.29910/bin/Hostx64/x64/cl.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "windows-msvc-x64"
}
],
"version": 4
}
My tasks.json :
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe build active file",
"command": "C:\\msys64\\mingw64\\bin\\g++.exe",
"args": [
"-g",
"${workspacefolder}/game.cpp", "${workspacefolder}/game.h", "${workspacefolder}/main.cpp",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "Task generated by Debugger."
},
{
"type": "shell",
"label": "build",
"command": "make",
"args": [
"CONF=Debug",
"-C",
"C:\\Users\\zebar\\.vscode"
]
}
],
"version": "2.0.0"
}
Main file (main.cpp):
#include "game.h"
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
int main(){
int menu_choice; // menu option
while(true) {
// Initiate Menu
menu_choice = menu();
switch (menu_choice) {
case 1: // Rules of the game
ReadRules();
cout << endl;
break;
default: // Exit the game
this_thread::sleep_for(chrono::seconds(2));
return 0;
}
}
}
Header file (game.h):
#ifndef T02_G11_GAME_H
#define T02_G11_GAME_H
#include <iostream>
#include <fstream>
#include <string>
#include <thread>
#include <chrono>
#include <iomanip>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
/**
Main menu
*/
int menu();
/**
Rules of the game
*/
void ReadRules();
#endif //T02_G11_GAME_H
game.cpp:
#include "game.h"
#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <iomanip>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
int menu(){
int menu_choice;
// Main Menu
cout << "1) Rules" << endl;
cout << "2) Play" << endl;
cout << "3) Leaderboard" << endl;
cout << "0) Exit" << endl;
// Ask for menu_choice
while (true)
{
this_thread::sleep_for(chrono::milliseconds(250));
cout << "Option: "; cin >> menu_choice;
if(cin.eof()) return 0;
if(cin.fail());
else if(menu_choice == 0) return 0;
else if(menu_choice == 1 || menu_choice == 2 || menu_choice == 3) return menu_choice;
cin.clear();
cin.ignore(10000, '\n');
cerr << "Input a valid operation! (0, 1 or 2 to proceed)" << endl;
}
}
void ReadRules(){
string line;
ifstream myfile ("rules.TXT"); // file where are the rules
int goBack;
// Open file and print all the lines
if(myfile.is_open())
{
while (getline(myfile, line)) cout << line << '\n';
myfile.close();
}
//Go back to main menu by pressing '0'
cout << "Press '0' to go to the main menu" << endl;
cin >> goBack;
//Test input while invalid
while(true){
cin >> goBack;
if(cin.eof()) return;
if(cin.fail());
else if(goBack == 0) break;
cin.clear();
cin.ignore(10000, '\n');
}
}
note: this is not the whole project, it is too big to post.
I'd be really thankful if someone could help me.