Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: C++ code::blocks static library

Aktivity
Avatar
pangas
Člen
Avatar
pangas:10.6.2016 0:39

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.6.2016 0:39
Avatar
Odpovídá na pangas
Patrik Valkovič:10.6.2016 8:18

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.6.2016 8:18
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
pangas
Člen
Avatar
pangas:10.6.2016 10:36

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.6.2016 10:36
Avatar
Nahoru Odpovědět
10.6.2016 10:44
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
pangas
Člen
Avatar
pangas:10.6.2016 10:53

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

 
Nahoru Odpovědět
10.6.2016 10:53
Avatar
pangas
Člen
Avatar
pangas:10.6.2016 11:39

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.6.2016 11:39
Avatar
martanec
Člen
Avatar
Odpovídá na pangas
martanec:10.6.2016 12:15

Nikde tam nevidim nieco ako

#include"h_subor_z_lib"
Editováno 10.6.2016 12:15
 
Nahoru Odpovědět
10.6.2016 12:15
Avatar
pangas
Člen
Avatar
Odpovídá na martanec
pangas:10.6.2016 13:50

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

#include "main.c"

Nic se nezlepší.

 
Nahoru Odpovědět
10.6.2016 13:50
Avatar
Odpovídá na pangas
Patrik Valkovič:10.6.2016 13:59

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.6.2016 13:59
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
pangas
Člen
Avatar
pangas:10.6.2016 14:37

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.6.2016 14:37
Avatar
Odpovídá na pangas
Libor Šimo (libcosenior):11.6.2016 7:13

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
11.6.2016 7:13
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
pangas
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
pangas:11.6.2016 10:32

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.6.2016 10:32
Avatar
Odpovídá na pangas
Libor Šimo (libcosenior):11.6.2016 10:44

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.6.2016 10:47
Nahoru Odpovědět
11.6.2016 10:44
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na pangas
Libor Šimo (libcosenior):11.6.2016 11:01

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.6.2016 11:01
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
pangas
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
pangas:11.6.2016 11:10

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

 
Nahoru Odpovědět
11.6.2016 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.