Portál AbcLinuxu, 13. května 2025 16:48

Dotaz: Ruzne lokace C++ knihovny

4.12.2009 19:35 Jan Koutny
Ruzne lokace C++ knihovny
Přečteno: 432×
Odpovědět | Admin
Dobry den,

programuji projekt v C++, ktery pouziva knihovnu libpcrepp. V Makefile na lokalnim stroji mam g++ option
-lpcrecpp
Knihovnu mam nainstalovanou zde:
$ locate libpcrecpp.so
/usr/lib/libpcrecpp.so
/usr/lib/libpcrecpp.so.0
/usr/lib/libpcrecpp.so.0.0.0
Preklad probehne bez problemu a vse funguje. Problem je kdyz chci projekt zkompilovat na jinem pocitaci, kde bezi FreeBSD a tam je umisteni zase takove:
locate libpcrecpp.so
/home2/local/lib/libpcrecpp.so
/home2/local/lib/libpcrecpp.so.0
S predchozim Makefilem mi preklad zhavaruje na tom, ze neni nalezena libpcrecpp knihovna. Pokud pridam do makefile toto:
-lpcrecpp -I/home2/local/include -L/home2/local/lib
Tak to funguje. Jenze je problem, ze program potrebuji kompilovat i pod jinym serverem, kde prvni Makefile zase nefunguje a umisteni knihoven je takove:
locate libpcrecpp.so
/usr/local/lib/libpcrecpp.so
/user/local/lib/libpcrecpp.so.0
Proto by me zajimalo, jestli jde Makefile napsat nejakym jednotnym zpusobem tak, abych nemusel mit pro kazdy server jiny Makefile.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

4.12.2009 20:30 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: Ruzne lokace C++ knihovny
Odpovědět | | Sbalit | Link | Blokovat | Admin
Asi budeš musieť použiť autoconf, cmake, waf... (ten program/skript nájde umiestnenie tých knižníc...)
4.12.2009 22:34 12345 | skóre: 41 | blog:
Rozbalit Rozbalit vše Re: Ruzne lokace C++ knihovny
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nevím, jestli to ve FreeBSD funguje stejně, ale v Linuxu se to dá řešit takhle:
pkg-config --libs --cflags libněco
4.12.2009 22:58 Boris Dušek | skóre: 22 | blog: everything
Rozbalit Rozbalit vše Re: Ruzne lokace C++ knihovny
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tady aspoň vidíš, jak nedokonalé je psát si vlastní Makefile (pokud neznáš dokonale jak syntax make, tak odlišnosti překladačů a linkerů na různých platformách). Takže dlouhodobější řešení je určitě použít nějakou nadstavbu (CMake, Scons, autotools atd.).

Ale když už máš napsaný ten Makefile, který v podstatě funguje, tak je škoda ho vyhodit - tady bych doporučil, aby si v Makefilu měl proměnnou např. LIBDIR, která je defaultně prázdná, ale uživatel ji může na command-line předefinovat. Např. make LIBDIR=/home2/local/lib. Pak v Makefilu otestuješ, jestli je prázdná, a pokud ne, tak přidáš -L$(LIBDIR) do link flagů.
vim ~/.emacs
5.12.2009 14:51 Zdenek
Rozbalit Rozbalit vše Re: Ruzne lokace C++ knihovny
Odpovědět | | Sbalit | Link | Blokovat | Admin
Dobry den, bohuzel neznam zrovna zpusob, jak konkretne ve Vasem pripade takovy Makefile napsat, ale videl jsem napr. v nekterych projektech pomerne bezne reseni, kdy se Makefile rozdeli do vice soubouru. V prvnim (napr. rules.mak) jsou definovana pravidla, ktere prekladace se pouzivaji a jsou zde definovany cesty ke knihovnam ap. Druhy soubor (Makefile) hned na zacatku nacita ten prvni (include rules.mak) a obsahuje konkretni pravidla napr. na preklad, nebo linkovani jisteho objektu, nebo vycisteni projektu ap. Vyhoda takoveho reseni mimo jine spociva v tom, ze muzete mit vice tech souboru s pravidly pro ruzne prekladace/configurace, nebo systemy, nebo muzete takove soubory s pravidly pouzivat pro vice projektu.
5.12.2009 15:10 l4m4
Rozbalit Rozbalit vše Re: Ruzne lokace C++ knihovny
Odpovědět | | Sbalit | Link | Blokovat | Admin
0. Dáš umístění knihovny do nějaké proměnné, která se pak v pravidlech používá. To v každém případě. Níže ji nazývám PCRE_PREFIX.

1. Použiješ autoconf. To nicméně není celé řešení, protože i autoconfu se v tomto případě musí pomoci, aby tu knihovnu našel, obzvlášť, pokud je v obskurních lokacích jako /home2/local/lib.

2. Použiješ pcre-config --prefix, aby ti řekl, kde se knihovna nachází. Lze i bez 1:
PCRE_PREFIX := $(shell pcre-config --prefix)
Normálně by se použil pkg-config nebo alespoň přímo pcre-config --cflags/pcre-config --libs, ale vypadá to, že přímo volby kompilátoru a linkeru umí pcre-config vypsat jen pro C verzi, ne pro C++.

3. Pokud je pcre-config v tak obskurním místě, že není v PATH, holt si ho tam musíš přidat, nebo na něj aspoň udělat z nějakého normálního místa v PATH symlink.
6.12.2009 00:25 vencas | skóre: 32
Rozbalit Rozbalit vše Re: Ruzne lokace C++ knihovny
V debianu je (balík libpcre++-dev) soubor /usr/bin/pcre++-config a funguje:
$ pcre++-config --libs
-L/usr/lib -lpcre++
6.12.2009 09:30 l4m4
Rozbalit Rozbalit vše Re: Ruzne lokace C++ knihovny
Ale nic takového není v upstreamu, což znamená, že je to zase pomýlená debianí aktivita...

Přidávat foo.pc soubory a foo-config skripty do balíku je naprostý nesmysl. Nijak to nezlepší přenositenost (kvůli které ty věci existují), jelikož to není v upstramu, a tudíž ani na ostatních systémech. Ba naopak to zmate vývojáře, kteří mohou nabýt mylné přesvědčení, že se tímto způsobem knihovna dá detekovat.

Nicméně, podíval jsem se pořádně, a i když pcre++-config vypadá jako výmysl Debianu, tak soubor pro pkg-config nakonec existuje, jmenuje se libpcrecpp.cpp, takže by mělo fungovat
pkg-config --cflags --libs libpcrecpp
7.12.2009 10:28 vencas | skóre: 32
Rozbalit Rozbalit vše Re: Ruzne lokace C++ knihovny
Tak jednak kecáš, pcre++-config.in v originálu libpcre++_0.9.5.orig.tar.gz (jak ho posytuje debian) existuje.

Jednak, i v debianu pochopitelně funguje taky
pkg-config libpcrecpp --cflags --libs
Jo, na debian nedám dopustit ;-)
7.12.2009 11:01 l4m4
Rozbalit Rozbalit vše Re: Ruzne lokace C++ knihovny
Aha, takže aby to nebylo tak jednoduchhé, on má Debian ještě navíc vlastní knihovnu prce... Poslední verze je 8.00 (dost nová, v distribucích bývá 7.něco), takže knihovna s verzí 0.9.5 je kdovíco. Mimochodem, ten přebalený a přejmenovaný .orig tarball v Debianu není pristine upstream source, takže jeho obsah není pro diskusi o upstreamu relevantní.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.