Byla vydána první veřejná preview verze PrusaSliceru 3.0. Přesně 15 let po zveřejnění první verze Slic3ru, které připadlo na 1. září 2011. Jedná se o dosud největší upgrade PrusaSliceru: "Řídili jsme se tím, co skutečně potřebujete, a tak jsme například zcela zahodili stávající uživatelské rozhraní a vytvořili ho znovu od nuly. Přinášíme také nový systém projektů, kompletně přepracované profily navržené pro moderní tiskárny s větším
… více »Byl vydán Mozilla Firefox 155.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Vypíchnout lze Smart Window, zatím ale dostupné pouze pro uživatele v USA, Kanadě a Francii. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 155 bude brzy k dispozici také na Flathubu a Snapcraftu.
Tima Cooka na pozici generálního ředitele společnosti Apple dnešním dnem nahradil John Ternus, který byl dosud odpovědný za hardware. Tim Cook vedl Apple od roku 2011, kdy funkci převzal od později zesnulého spoluzakladatele společnosti Stevea Jobse. Za 15 let v čele Applu více než zdvojnásobil tržní hodnotu firmy.
Organizátoři konference LinuxDays ukončil veřejné přihlašování přednášek. Teď je na vás, abyste vybrali nejlepší témata pro letošní ročník. Hlasovat můžete do pondělí 7. září, poté bude podle výsledků hlasování sestaven program pro letošní ročník.
Servo, engine webového prohlížeče napsaný v Rustu, byl vydán ve verzi 0.5.0. Novinky shrnuje přehled projektu za červenec. Došlo k dalšímu pokroku ve vykreslování webových stránek. Současným cílem projektu je vytvořit komponentu webového prohlížeče jako WebView pro použití v jiných aplikacích.
IKEA a XBOX představují kolekci YXSTABY (pdf). Ta přináší designová a praktická řešení, díky nimž se prostor pro hraní během sekundy promění v útulný a harmonický domov.
Jonathan Thomas oznámil vydání verze 4.0 nelineární střižny OpenShot. Nově podporuje nahrávání obrazu a zvuku, vylepšuje uživatelské rozhraní, mj. color grading, přidává další efekty a mnoho dalšího (seznam změn).
Proběhlo hlasování o používání LLM při vývoji Debianu. Vývojáři Debianu si odhlasovali zodpovědné využívání generativní umělé inteligence.
Sovereign Tech Agency (Wikipedie) prostřednictvím svého fondu Sovereign Tech Fund podpoří vývoj Flatpaku částkou 508 640 eur.
Byla vydána první veřejná verze v7.0-mk2 projektu Multikernel (mklinux), který umožňuje spouštět více nezávislých linuxových jader současně na jednom stroji bez hypervizoru.
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: