Byly zpracovány a na YouTube zveřejněny videozáznamy jednotlivých přednášek z letošního Installfestu.
Od 21. do 23. března proběhnou Arduino Days 2024. Sledovat bude možné oficiální streamy. Zúčastnit se lze i lokálních akcí. V Česku jsou aktuálně registrovány dvě: v Praze na Matfyzu a v Poličce v městské knihovně.
Letošní ročník konference LinuxDays se uskuteční o víkendu 12. a 13. října, opět se potkáme v pražských Dejvicích na FIT ČVUT. Také během letošního ročníku nás budou čekat desítky přednášek, workshopy, stánky a spousta doprovodného programu. Aktuální dění můžete sledovat na Twitteru, Facebooku nebo na Mastodonu, přidat se můžete také do telegramové diskusní skupiny.
Byla vydána nová major verze 2.0.0 a krátce na to opravné verze 2.0.1 open source online editoru Etherpad (Wikipedie) umožňujícího společné úpravy v reálném čase.
Matematický software GNU Octave byl vydán ve verzi 9.1.0. Podrobnosti v poznámkách k vydání. Nově je preferovaný grafický backend Qt a preferovaná verze Qt 6. V tomto vydání byly přepracovány funkce pro převod čísel z desítkové soustavy. Jako obvykle jsou zahrnuta také výkonnostní vylepšení a zlepšení kompatibility s Matlabem.
Společnost PINE64 stojící za telefony PinePhone nebo notebooky Pinebook publikovala na svém blogu březnový souhrn novinek. Vypíchnout lze, že pracují na virtuálním asistentu PineVox a zatím bezejmenných sluchátkách na lícní kosti (bone conduction).
Hyprland, kompozitor pro Wayland zaměřený na dláždění okny a zároveň grafické efekty, je již dva roky starý. Při té příležitosti byla vydána verze 0.37.0 (a záhy opravná 0.37.1 řešící chybu ve vykreslování oken). Nově závisí na knihovně hyprcursor, která poskytuje škálovatelné kurzory myši.
Geolokační služba Mozilla Location Service, kterou používá množství svobodného softwaru (často přes Geoclue), letos skončí. Data budou dostupná pouze do 10. dubna 2024, API klíče třetích stran budou odstraněny 12. června. Příčinou je údajné porušení patentů firmy Skyhook v roce 2019, následná dohoda omezila rozvoj MLS.
O víkendu probíhá v Praze na Karlově náměstí 13 konference Installfest 2024. Na programu je celá řada zajímavých přednášek a workshopů.
template <typename Stringish> http_rep http_client::post(const std::string& path, Stringish&& body) const { std::map<std::string, std::string> foo; // po odstranění tohoto řádku chyba zmizí return http_rep(); } template http_rep http_client::post<>( const std::string& path, std::string&& body) const;Kompilace skončí s chybou:
Error LNK2005 "public: class std::_Tree_iterator<class std::_Tree_val<struct std::_Tree_simple_types<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > > __cdecl std::_Tree<class std::_Tmap_traits<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >,0> >::end(void)" (?end@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@std@@@2@$0A@@std@@@std@@QEAA?AV?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@std@@@std@@@std@@@2@XZ) already defined in http.obj
Pokud zakomentuju řádek std::map<std::string, std::string> foo;
, projekt se zkompiluje. I třeba pokud změním první typ na int (std::map<int, std::string> foo;
). Na jménu proměnné nezáleží, chová se to stejně.
Co se tam může dít? Nerozumím, proč zavedení lokální proměnné má vliv na linkování. Tuším, že jsem tu chybu viděl i jindy, ve stejně "divných" případech, třeba po přidání const k jiné lokální proměnné.
Myslím si, že tenhle konkrétní kus kódu je ok, ale jinde v projektu je něco hodně špatně. Ale nenapadá mě co hledat a ta chybová hláška mi zrovna nepomáhá ...
An explicit specialization of a function or variable template is inline only if it is declared with the inline specifier or defined as deleted, and independently of whether its function or variable template is inline.
Takže zkus:
template inline http_rep http_client::post<>(...
http_rep http_client::post(const std::string& path, const std::string& body) constPřijde mi, že někde přeteče nějaký limit v kompilátoru a on se začne chovat jinak, a pak se projeví chyba, která doteď nebyla vidět. Existuje něco jako nedefinované chování kompilátoru při špatné konstrukci?
#pragma once
). Každopádně teorie o chybě v šabloně padly s tím, že to jde zopakovat i bez šablony.
Hele nechybí ti náhodou v hlavičkovém souboru
#ifndef _TEST_HEADER_
#define _TEST_HEADER_
#endif
Případně nadáváš linkeru dvakrát jeden objektový soubor? "already defined in http.obj" tohle znamená, že existují minimálně dva objekty stejně pojmenované. Proto bych hledal chybu v překladovém systému, nebo něco na způsob vkládání (include) jednoho stejného souboru dvakrát.
#ifndef _TEST_HEADER_ #define _TEST_HEADER_ #endifnebo
#pragma onceověřoval jsem, že pragmu kompilátor podporuje. Mám teď teorii, že je někde v hlavičkovém souboru i definice a linker ten soubor dostane dvakrát, jak píšeš. Pokud překladač danou funkci inlinuje, tak se chyba neprojeví. Dává mi smysl, že kompilátor při objevení složitější proměnné přehodnotí inlinování, což vysvětluje, proč se to chování mění s odstraněním řádku. Příklad na to linkování je třeba na http://www.cplusplus.com/forum/beginner/104849/
KUREVSKY_SLOŽITÁ_TEMPLATE::end()
, v tvém případě iterátorové funkce end()
pro std::map
. Podívej se, kde jinde v kódu používáš std::map<std::string, std::string>
a jak. Když změníš typ klíče na int
, vypadá funkce end()
jinak a už k té kolizi nedojde. Skoro to vypadá, jako by se ti z nějaké překladové jednotky jiné než http.obj
ta funkce end()
exportovala a proto se ti to srazí. Absolutní rána do prázdna: neprovádíš tam někde explicitní instanciace funkcí, co by žraly std:map<std::string, std::string>
jako parametr?
std::map
se tam skoro nepoužívá, šel jsem po výskytech. V jiném .cpp
souboru je tato třída (ořezal jsem ji na minimum)
namespace { class foo { public: foo(); std::map<std::string, std::string> namespaces; }; foo::foo() {}; }Takto to vyvolá chybu [1], což čtu jako konstruktor
std::map<std::string, std::string>()
. Zakomentování řádku v původním postu stačí, aby se to zkompilovalo. Kompilace také projde, pokud kód vypadá takto:
namespace { class foo { public: foo(); // std::map<std::string, std::string> namespaces; }; foo::foo() {}; }nebo takto
namespace { class foo { public: foo() {}; std::map<std::string, std::string> namespaces; }; }V příslušném hlavičkovém souboru se třída foo nevyskytuje, jen v .cpp souboru. Nepoužívá se nikde (smazal jsem výskyty). Vysvětlení mě zatím nenapadá, zatím přemýšlím, co to říká. [1]
Error LNK2005 "public: __cdecl std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > >::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > >(void)" (??0?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@std@@@2@@std@@QEAA@XZ) already defined in http.obj
std::map<std::string, std::string>
objevují ve více překladových jednotkách a mají externí linkage, ale to ti asi došlo. S touhle situací by si měl linker poradit, protože u šablonových funkcí se tohle prostě děje. Zmínil jsi, že ten projekt má nějaký podivný build systém, možná bych se podíval, jestli se tam nějak podivně nešaškuje s STL kontejnery. Fakt by to chtělo nějaký minimální zkompilovatelný příklad, kdy se to rozbije.
namespace { class foo { public: foo(); std::map<std::string, std::string> namespaces; }; inline foo::foo() {}; }Zkus to takto. Chybi ti tam inline a pokud ten header includnes ze 2 cpp, budes tam mit 2 symboly pro ten jeden ctor. To, ze to funguje se zakomentovanou mapou, bude mozna kvuli optimalizaci, protoze ctor je pak noop.
Tiskni Sdílej: