Dyrektywa #include ze ścieżką dostępu


(adrian.lodz) #1

Witam.

Mam takie pytanko.

Jak dołączyć do projektu dyrektywę #include z podaną ścieżką do swojej biblioteki?

Jeśli wpiszę #include “…/moje_biblioteki/wypelnianie_i_wypisywanie_tablicy.h” to wyskakują mi błędy:

/home/adrian/Zadania z programowania/sortowanie/sortowanie_przez_scalanie/main.cpp:51: błąd: undefined reference to `wypelnij_tablice(unsigned int*, unsigned int)’

/home/adrian/Zadania z programowania/sortowanie/sortowanie_przez_scalanie/main.cpp:53: błąd: undefined reference to `wypisz_tablice(unsigned int*, unsigned int)’

/home/adrian/Zadania z programowania/sortowanie/sortowanie_przez_scalanie/main.cpp:57: błąd: undefined reference to `wypisz_tablice(unsigned int*, unsigned int)’

:-1: błąd: collect2: error: ld returned 1 exit status

Ale zapis #include “…/moje_biblioteki/wypelnianie_i_wypisywanie_tablicy.cpp” działa.

O co chodzi? Czemu działa dołączenie pliku *.cpp a nie działa dołączenie pliku .*h?

Używam:

Qt Creator 4.0.3

Bazujący na Qt 5.6.1 (GCC 4.9.1 20140922 (Red Hat 4.9.1-10), 64 bitowy)
Wersja z Jul 5 2016 04:19:27
Z poprawki ce4ddcb060

System:

Ubuntu MATE 16.04 x64

Zawartość pliku wypelnianie_i_wypisywanie_tablicy.cpp:

#include "wypelnianie_i_wypisywanie_tablicy.h"

void wypelnij_tablice(uint *tab,uint n)

{

    srand(time(NULL));

    for(uint i=0;i<n;i++)

    {

        tab[i]=(rand()%900)+100;

    }

}

void wypisz_tablice(uint *tab,uint n)

{

    for(uint i=0;i<n;i++)

    {

        if(i%10==0)cout<<endl;

        cout<<tab[i]<<" ";

    }

}

Zawartość pliku wypelnianie_i_wypisywanie_tablicy.h:

#ifndef WYPELNIANIE_I_WYPISYWANIE_TABLICY_H

#define WYPELNIANIE_I_WYPISYWANIE_TABLICY_H

#include <iostream>

#include <time.h>

#include <cstdlib>

using namespace std;

void wypelnij_tablice(uint *, uint n);

void wypisz_tablice (uint *, uint n);

#endif // WYPELNIANIE_I_WYPISYWANIE_TABLICY_H

A potrzebuję takiej biblioteki w osobnym folderze, gdyż będę używał jej w kilku różnych projektach.

 


(Rolek0) #2

undefined reference to błąd linkera oznaczający, że nie znalazł wymaganego obiektu (funkcji/zmiennej).

Jeśli zaincludowanie pliku .cpp “rozwiązuje” problem to znaczy, że ten plik nie był kompilowany i dołączony do reszty programu.

Jeśli używasz Qt to po prostu dodaj wszystkie potrzebne pliki .cpp do projektu.

 

 


(adrian.lodz) #3

Czyli że muszę zostać przy zaincludowaniu pliku .cpp lub muszę przerzucić pliki do projektu?

Dobra. Udało się.

Przerobiłem zawartość pliku sortowanie_przez_scalanie.pro:
 

TEMPLATE = app

CONFIG += console c++11

CONFIG -= app_bundle

CONFIG -= qt



HEADERS += ../moje_biblioteki/wypelnianie_i_wypisywanie_tablicy.h

SOURCES += main.cpp

SOURCES += ../moje_biblioteki/wypelnianie_i_wypisywanie_tablicy.cpp

 

Ale czy nie ma gdzieś opcji w Qt Creator żeby dodać te pliki? Tylko trzeba ręcznie wklepać mu dodatkowe dwie linijki do pliku .pro?


(Johny) #4

Gdzieś są polecenia dołącz do projektu - add file to project.Kompilator i linker muszą pobrać ścieżki,żeby wiedzieć gdzie szukać funkcji z twojej biblioteki.Dołączony plik pokarze ci się na liście projektu.

Będzie to w samym Qt Creatorze. 


(adrian.lodz) #5

Dobra. Znalazłem. Trzeba kliknąć na PPM na projekcie i jest opcja Dodaj pliki…

A szukałem w górnym menu