Forum » Programiranje » Gcc linkanje .so
Gcc linkanje .so
ozbolt ::
Nekaj delam narobe, pa ne vem kaj. Pa bom vprasal tule, ker imam obcutek, da ce kdo ve, bo odgovoril v sekundi.
Torej, make -n za library:
Potem, make -n za app: (v ./lib se nahaja mylib.so)
In dobim: (MyClass::MyClass konstruktor naj bi bil v .so knjizici)
Napaka tudi z:
Zadeva pa lepo deluje, ce zadnji link korak zamenjam z ukazom:
Pozor, vsak IniFile.o je skompajlan iz svojega IniFile.cpp-ja!. Imata pa vsak svoje razrede, tako da se nic ne prekriva.
Torej, make -n za library:
g++ -c ... [flagi za vsega boga] ... -o IniFile.o IniFile.cpp g++ -shared -Wl,-soname,mylib.so.1 -o mylib.so.1.0.0 IniFile.o ... [linkanje flagi] ln -s mylib.so.1.0.0 mylib.so ln -s mylib.so.1.0.0 mylib.so.1 ln -s mylib.so.1.0.0 mylib.so.1.0
Potem, make -n za app: (v ./lib se nahaja mylib.so)
g++ -c <[flagi za vsega boga]> -o ./Main.o ../../Main.cpp <[dodatni compajli]> g++ -o bla ./Main.o ./gtest-all.o ./IniFile.o ./VecPtr.o -L./lib <[ostali linkanje flagi]>
In dobim: (MyClass::MyClass konstruktor naj bi bil v .so knjizici)
/home/user/workspace/bla/Main.cpp:15: undefined reference to `MyClass::MyClass(QString, bool)' <[ostale nenajdene reference]>
Napaka tudi z:
g++ -o bla ./Main.o ./gtest-all.o ./IniFile.o ./VecPtr.o -l./lib/mylib <[ostali linkanje flagi]>
Zadeva pa lepo deluje, ce zadnji link korak zamenjam z ukazom:
g++ -o bla ./Main.o ./gtest-all.o ./IniFile.o ./VecPtr.o ../lib/IniFile.o <[ostali linkanje flagi]>
Pozor, vsak IniFile.o je skompajlan iz svojega IniFile.cpp-ja!. Imata pa vsak svoje razrede, tako da se nic ne prekriva.
Randomness ::
Se boš moral bolj potruditi, dal si premalo informacij. Pripravi minimalen primer, pa ti bom(o) potem pomagal(i). Zna pa se zgoditi, da si boš že sam odgovoril, ko boš pripravljal minimalen primer.
AndrejO ::
Nekaj delam narobe, pa ne vem kaj. Pa bom vprasal tule, ker imam obcutek, da ce kdo ve, bo odgovoril v sekundi.
1) Standarno ime za knjižnico je libNEKAJ.so. Drži se tega standarda in tvoje življenje bo neskončno lažje. Torej ne "mylib.so", ampak "libmylib.so" ali nekaj na to temo.
2) Pri povezovanju aplikacije moraš uporabiti -L, s katerim poveš kje naj povezovalnik išče knjižnice.
3) Pri povezovanju aplikacije uporabiš -l, s katerim poveš katero knjižnico naj potegne notri.
Torej za vse skupaj:
g++ -o libmylib.so.1.2.3 ...
g++ -L./lib -lmylib ...
Zgodovina sprememb…
- spremenil: AndrejO ()
ozbolt ::
Randomness, bilo je dovolj informacij, problem je bil v imenu: mylib.so. Ker ld je navajen na lib*, torej libmylib.so recimo.
Hvala, Andrej, vzeto na znanje. In dela :)
Hvala, Andrej, vzeto na znanje. In dela :)
Randomness ::
ozbolt, informacij je bilo dovolj mogoče za educated guess, ne pa za zanesljiv odgovor. Tudi jaz sem namreč videl potencialen problem z manjkajočo predpono lib, vendar ld zna načeloma zlinkati so-je s poljubnim imenom. Čeprav se drugače strinjam s tem, kar ti je svetoval že AndrejO.
golobich ::
Načeloma je tudi bolj fajn da nastaviš linker na lib direktorij. Se pravi podaš gcc ju stikalo -L kateremu sledi direktorij in potem -l kateremu sledi ime liba
Se pravi bi zadni korak naredil takole:
in ja, moreš pazit da ima tvoj lib predpono lib. Se pravi to bi delalo v primeru da imaš libmylib.
In še ena opazka, to ni ravno gcc linkanje ampak g++ linkanje :) Navadno se gcc uporablja za programski jezik C medtem ko se g++ uporablja za programski jezik C++. Vem, marsikatero C++ aplikacijo lahko prevedemo tudi z gcc-jem ampak dovolj o tem :)
lp, golobich
Se pravi bi zadni korak naredil takole:
g++ -o bla ./Main.o ./gtest-all.o ./IniFile.o ./VecPtr.o .L ./lib -lmylib <[ostali linkanje flagi]>
in ja, moreš pazit da ima tvoj lib predpono lib. Se pravi to bi delalo v primeru da imaš libmylib.
In še ena opazka, to ni ravno gcc linkanje ampak g++ linkanje :) Navadno se gcc uporablja za programski jezik C medtem ko se g++ uporablja za programski jezik C++. Vem, marsikatero C++ aplikacijo lahko prevedemo tudi z gcc-jem ampak dovolj o tem :)
lp, golobich
Zgodovina sprememb…
- spremenil: golobich ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Code:Blocks, c++] Program ne najde knjižniceOddelek: Programiranje | 1373 (1152) | gtu |
» | Makefile in c++Oddelek: Programiranje | 3082 (2122) | Looooooka |
» | [C++] Problem pri vključitvi header-jaOddelek: Programiranje | 1214 (1045) | matijaz74 |
» | Kateri programski jezik?Oddelek: Programiranje | 4556 (3169) | kopernik |
» | C# je mozna referenca do int izven funkcije (direkt v classu torej)Oddelek: Programiranje | 1617 (1431) | TopCat |