Avatar
pangas
Člen
Avatar
pangas:

Zdravím,
prosím pomozte, jsem už zoufalej. Snažím se vytvořit statickou knihovnu v code::blocks.

Knihovnu vytvořím, mám tam pouze jednoduchou funkci a chci testovat, jestli knihovna bude fungovat.
Jenže když potom v dalším projektu, chci použít funkci z knihovny, hlásí mi error: undefined reference to "nazev_funkce".

V link libraries mám knihovnu připojenou. Prošel už asi tak 10 článků, nic prostě.

Takhle vypadá celý kód:

///main.cpp
///projekt, ve kterem chci testovat knihovnu
#include <iostream>

using namespace std;
int Add(int i1, int i2);
int main()
{
    cout << Add(1, 2) << endl;
    return 0;
}
///knihovna
int Add(int i1, int i2)
{
    return i1 + i2;
}

Děkuji za každou radu.

 
Odpovědět 10. června 0:39
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na pangas
patrik.valkovic:

Pokud máš pouze statickou knihovnu (ne dynamickou), tak ji musíš přilinkovat při kompilaci. Spustíš "g++ main.cpp lib.a"

Nahoru Odpovědět 10. června 8:18
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
pangas
Člen
Avatar
pangas:

A kde přesně bych toto měl spustit? Dělám to poprvé, tak s tím nemám žádnou zkušenost.

 
Nahoru Odpovědět 10. června 10:36
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Nahoru Odpovědět 10. června 10:44
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
pangas
Člen
Avatar
pangas:

Zkoušel jsem znova, pořád stejný error.

 
Nahoru Odpovědět 10. června 10:53
Avatar
pangas
Člen
Avatar
pangas:

Vypíšu sem postup, jakým celý proces dělám, snad někdo najde chybu.

  1. vytvořím nový projekt - static library - název "K", provedu build
  2. vytvořím nový projekt - console application - "ZK"
  3. připojím knihovnu "K" v Link libraries.
  4. chci vyzkoušet funkci z "K" v "ZK" - undefined reference to "nazev_funkce". error ld returned 1 exit status
 
Nahoru Odpovědět 10. června 11:39
Avatar
martanec
Člen
Avatar
Odpovídá na pangas
martanec:

Nikde tam nevidim nieco ako

#include"h_subor_z_lib"
Editováno 10. června 12:15
 
Nahoru Odpovědět 10. června 12:15
Avatar
pangas
Člen
Avatar
Odpovídá na martanec
pangas:

Knihovna se skládá pouze z jediného souboru main.c.
Pokud zahrnu

#include "main.c"

Nic se nezlepší.

 
Nahoru Odpovědět 10. června 13:50
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na pangas
patrik.valkovic:

Musíš mít deklaraci v hlavičkovém souboru a definici v .c souboru. Zkompiluje se .c souor a tu hlavičku musíš includovat do druhého projektu. Hlavičkové soubory .h obsahují informace o tom, co je v knihovně k dispozici. Potom .c nebo .cpp soubory se zkompilují do knihovny již obsahuje implementaci.

Nahoru Odpovědět 10. června 13:59
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
pangas
Člen
Avatar
pangas:

Děkuji za trpělivost.
Vytvořil jsem v knihovně hlavičkový soubor main.h. Pokud ho includuju do druheho projektu, tak už je vidět, že program o funkci ví, ale vyskakuje pořád stejný error.

 
Nahoru Odpovědět 10. června 14:37
Avatar
Odpovídá na pangas
Libor Šimo (libcosenior):

Takže asi takto:

  1. vytvoríš v C:B nový projekt - automaticky sa vytvorí súbor main.cpp
  2. prepíšeš ten súbor:
#include <iostream>
#include "knih.h" // includuješ knižnicu

using namespace std;

int main()
{
    cout << Add(1, 2) << endl;
    return 0;
}

3. myšou vyberieš File -> New -> Empty file a pridáš prázdny súbor ktorý nazveš knih.h (hlavičkový súbor)
4. napíšeš doň kód:

/**
 * Knižnica vráti súčet dvoch celých čísiel typu int
 * @param i1 prvý vstupný parameter
 * @param i2 druhý vstupný parameter
 * @return súčet vstupných parametrov
 */
int Add(int, int);

5. myšou vyberieš File -> New -> Empty file a pridáš prázdny súbor ktorý nazveš knih.cpp (zdrojový súbor)
6. napíšeš doň kód:

int Add(int i1, int i2)
{
    return i1 + i2;
}

7. scompiluješ a spustíš.

Keď budeš chcieť knižnicu použiť v inom projekte, nakopíruješ doňho hlavičkový aj zdrojový súbor knižnice a pridáš ich do projektu (myšou vyberieš Project -> Add files), v main.cpp includuješ hlavičkový súbor knižnice.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 11. června 7:13
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
pangas
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
pangas:

Děkuji moc, s tímhle si zatím vystačím. Avšak zeptám se ještě, jak by šlo udělat, aby mi stačilo pouze

#include "knihovna"

a nemusel přidávat celé složky. Ale díky, vyřešil jste můj problém.

 
Nahoru Odpovědět 11. června 10:32
Avatar
Odpovídá na pangas
Libor Šimo (libcosenior):

Vsetko co inkludujes musi byt k dispozicii hlavnemu programu. Aj kniznica iostream je ulozena tak, aby bol k nej z programu pristup.
Urcite je moznost ulozit vlastnu kniznicu do zlozky, kde su ostatne predinstalovane kniznice a potom ju volat #include <kniznica>, ale toto som zatial nemal dovod riesit.

Editováno 11. června 10:47
Nahoru Odpovědět 11. června 10:44
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na pangas
Libor Šimo (libcosenior):

Este jedna vec. Ak spravis co som napisal vyssie, budes moct kniznicu pouzivat iba na pc, kde mas tu kniznicu. Na inom compe to nepojde, pretoze tam nebude.
Takze sposob pridania kniznice do zlozky projektu je lepsi a praktickejsi.

Nahoru Odpovědět 11. června 11:01
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
pangas
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
pangas:

Dobře, děkuji ještě jednou.

 
Nahoru Odpovědět 11. června 11:10
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.