» »

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:

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 ::

ozbolt je izjavil:

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 :)

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:

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Code:Blocks, c++] Program ne najde knjižnice

Oddelek: Programiranje
111363 (1142) gtu
»

Makefile in c++

Oddelek: Programiranje
253071 (2111) Looooooka
»

[C++] Problem pri vključitvi header-ja

Oddelek: Programiranje
61203 (1034) matijaz74
»

Kateri programski jezik?

Oddelek: Programiranje
494544 (3157) kopernik
»

C# je mozna referenca do int izven funkcije (direkt v classu torej)

Oddelek: Programiranje
81608 (1422) TopCat

Več podobnih tem