José Rodrigues
José Rodrigues

Reputation: 37

New to C++, undefined reference

Normally I program in java, also have some basic concepts in C (header, make files, functions, pointers, programming in C and using assembly functions[in college], forks, threads, semaphores, pipes).

I am trying to create a simple program in C++ to add to my git repository and to add experience.

Basically in the main I invoke to classes: Categoty and CategoryList.

One CategoryList can have zero or more Category objects.

Problem:

The code gives some error: "undefined reference" basically in the main.

CategoryList *cat = new CategoryList();
Category *c = new Category("Banana","Sobre bananas");
cat->addCategory(*c);

Where I want to simply create a list, and add a element to that List.

The CODE:

CategoryList Header:

#ifndef CATEGORYLIST_H
#define CATEGORYLIST_H

#include <./src/Domain/Category.h>
#include <set>

using namespace std;


class CategoryList{

protected:
    /**
     *  CATEGORY LIST 
     **/
    set<Category> categorySet;


public:
    CategoryList();
    CategoryList(set<Category> c);
    void addCategory(Category c);
    int main();

private:


};

#endif // CATEGORYLIST_H

CategoryList Cpp:

#include "categorylist.h"


CategoryList::CategoryList(){
    this->categorySet = set<Category>();
}

CategoryList::CategoryList(set<Category> list){
    this->categorySet = list;
}


void CategoryList::addCategory(Category c){
        this->categorySet.insert(c);
}

The category Header:

#ifndef CATEGORY_H
#define CATEGORY_H


#include <string>

using namespace std;

class Category{

protected:
    string name;
    string description;


public:
    Category(string name, string description);


private:


};

#endif // CATEGORY_H

The Category Cpp:

#include "Category.h"


/**
 *
 *  CONSTRUCTOR 
 * 
 **/
Category::Category(string name, string description){
    this->name = name;
    this->description = description;
}

The main cpp:

#include "firstcplusplusqt5program.h"
#include <QApplication>
#include <iostream>
#include <string>

#include "List/categorylist.h"
#include "Domain/Category.h"

using namespace std;

void simpleTest();

int main(int argc, char *argv[]){

    simpleTest();

    QApplication app(argc, argv);
    FirstCplusPlusQt5Program w;
    w.show();

    return app.exec();

}


/**
 * 
 * USE THIS FUNCION TO TESTE SIMPLE FUNCTIONS ON STARTUP
 * 
 **/
void simpleTest(){
    cout << "Welcome to José Rodrigues first cpp program." << endl;
    for (int i = 0 ; i < 3 ; i++){
        cout << "Count " << i << endl;
    }

    CategoryList *cat = new CategoryList();
    Category *c = new Category("Banana","Sobre bananas");
    cat->addCategory(*c);


}

The IDE i have used (Kdevelop,Netbeans, QT Creator) don't show any error in this config. So only the compiler gives the error:

/home/arch-admin/Git/FirstCplusPlusQtApp/FirstCplusPlusQt5Program/build> /usr/bin/ninja firstcplusplusqt5program
[1/4] Automatic MOC for target firstcplusplusqt5program
[2/3] Building CXX object CMakeFiles/firstcplusplusqt5program.dir/src/main.cpp.o
[3/3] Linking CXX executable firstcplusplusqt5program
FAILED: firstcplusplusqt5program 
: && /usr/bin/c++  -g  -rdynamic CMakeFiles/firstcplusplusqt5program.dir/src/main.cpp.o CMakeFiles/firstcplusplusqt5program.dir/src/firstcplusplusqt5program.cpp.o CMakeFiles/firstcplusplusqt5program.dir/firstcplusplusqt5program_autogen/moc_compilation.cpp.o  -o firstcplusplusqt5program  /usr/lib/libQt5Widgets.so.5.9.0 /usr/lib/libQt5Gui.so.5.9.0 /usr/lib/libQt5Core.so.5.9.0 && :
CMakeFiles/firstcplusplusqt5program.dir/src/main.cpp.o: In function `simpleTest()':
/home/arch-admin/Git/FirstCplusPlusQtApp/FirstCplusPlusQt5Program/build/../src/main.cpp:37: undefined reference to `CategoryList::CategoryList()'
/home/arch-admin/Git/FirstCplusPlusQtApp/FirstCplusPlusQt5Program/build/../src/main.cpp:38: undefined reference to `Category::Category(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
/home/arch-admin/Git/FirstCplusPlusQtApp/FirstCplusPlusQt5Program/build/../src/main.cpp:39: undefined reference to `CategoryList::addCategory(Category)'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
*** Failure: Exit code 1 ***

Project structure (src only because of size):

`-- src
|       |-- Controller
|       |-- Domain
|       |   |-- Author.cpp
|       |   |-- Author.h
|       |   |-- Category.cpp
|       |   |-- Category.h
|       |   |-- annotation.cpp
|       |   `-- annotation.h
|       |-- List
|       |   |-- categorylist.cpp
|       |   `-- categorylist.h
|       |-- PlantUmlGenerator
|       |-- UI
|       |-- Utils
|       |   |-- utils.cpp
|       |   `-- utils.h
|       |-- firstcplusplusqt5program.cpp
|       |-- firstcplusplusqt5program.h
|       |-- firstcplusplusqt5program.ui
|       `-- main.cpp

Could it be the makefile?

In the Qt project is a file CmakeList.txt, should I alter this config files for the dependencies?

Thank you in advance.

CmakeList.txt

cmake_minimum_required(VERSION 2.8.11)
project(FirstCplusPlusQt5Program)

# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)

# Find the QtWidgets library
find_package(Qt5Widgets REQUIRED)

set(firstcplusplusqt5program_SRC
  src/main.cpp
  src/firstcplusplusqt5program.cpp
)

# Create code from a list of Qt designer ui files.
#set(CMAKE_AUTOUIC ON) # use this if you have CMake 3.x instead of the following
qt5_wrap_ui(firstcplusplusqt5program_SRC src/firstcplusplusqt5program.ui)

# Tell CMake to create the helloworld executable
add_executable(firstcplusplusqt5program ${firstcplusplusqt5program_SRC})

# Use the Widgets module from Qt 5.
target_link_libraries(firstcplusplusqt5program Qt5::Widgets)

# Install the executable
install(TARGETS firstcplusplusqt5program DESTINATION bin)

Upvotes: 1

Views: 1099

Answers (1)

K. Kirsz
K. Kirsz

Reputation: 1420

You need to add all .cpp files to your CMakeList.txt

...
set(firstcplusplusqt5program_SRC
  src/main.cpp
  src/firstcplusplusqt5program.cpp
  src/List/categoryList.cpp
  src/Domain/Category.cpp
  ...
)
...

Upvotes: 1

Related Questions