cmake und finden sie andere projekte und ihre abhängigkeiten
<p>stellen sie sich folgendes szenario vor: projekt a ist eine gemeinsam genutzte bibliothek mit mehreren abhängigkeiten (liba, libb, libc). projekt b ist eine ausführbare datei, die von projekt a abhängig ist und daher auch alle abhängigkeiten von projekt a benötigt, um zu erstellen.</p><p>außerdem werden beide projekte mit cmake erstellt. projekt a sollte nicht installiert werden (über das installationsziel), damit project b es verwenden kann, da dies für entwickler ärgerlich werden kann.</p><p>die frage ist also: wie kann man diese abhängigkeiten mit cmake am besten lösen? die ideale lösung wäre so einfach wie möglich (wenn auch nicht einfacher) und erfordert nur minimale wartung.</p>
<p>einfach. hier ist das beispiel aus meinem kopf:</p><h1>die oberste ebene <code>cmakelists.txt</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) # you can tweak some common (for all subprojects) stuff here. for example: set(cmake\_disable\_in\_source\_build on) set(cmake\_disable\_source\_changes on) if ("${cmake\_source\_dir}" strequal "${cmake\_binary\_dir}") message(send\_error "in-source builds are not allowed.") endif () set(cmake\_verbose\_makefile on) set(cmake\_color\_makefile on) # remove 'lib' prefix for shared libraries on windows if (win32) set(cmake\_shared\_library\_prefix "") endif () # when done tweaking common stuff, configure the components (subprojects). # note: the order matters! the most independent ones should go first. add\_subdirectory(components/b) # b is a static library (depends on boost) add\_subdirectory(components/c) # c is a shared library (depends on b and external xxx) add\_subdirectory(components/a) # a is a shared library (depends on c and b) add\_subdirectory(components/executable) # executable (depends on a and c) </code></pre><h1><code>cmakelists.txt</code> in <code>components/b</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) project(b c cxx) find\_package(boost 1.50.0 required) file(glob cpp\_files source/*.cpp) include\_directories(${boost\_include\_dirs}) add\_library(${project\_name} static ${cpp\_files}) # required on unix os family to be able to be linked into shared libraries. set\_target\_properties(${project\_name} properties position\_independent\_code on) target\_link\_libraries(${project\_name}) # expose b's public includes (including boost transitively) to other # subprojects through cache variable. set(${project\_name}\_include\_dirs ${project\_source\_dir}/include ${boost\_include\_dirs} cache internal "${project\_name}: include directories" force) </code></pre><h1><code>cmakelists.txt</code> in <code>components/c</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) project(c c cxx) find\_package(xxx required) file(glob cpp\_files source/*.cpp) add\_definitions(${xxx\_definitions}) # note: boost's includes are transitively added through b\_include\_dirs. include\_directories(${b\_include\_dirs} ${xxx\_include\_dirs}) add\_library(${project\_name} shared ${cpp\_files}) target\_link\_libraries(${project\_name} b ${xxx\_libraries}) # expose c's definitions (in this case only the ones of xxx transitively) # to other subprojects through cache variable. set(${project\_name}\_definitions ${xxx\_definitions} cache internal "${project\_name}: definitions" force) # expose c's public includes (including the ones of c's dependencies transitively) # to other subprojects through cache variable. set(${project\_name}\_include\_dirs ${project\_source\_dir}/include ${b\_include\_dirs} ${xxx\_include\_dirs} cache internal "${project\_name}: include directories" force) </code></pre><h1><code>cmakelists.txt</code> in <code>components/a</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) project(a c cxx) file(glob cpp\_files source/*.cpp) # xxx's definitions are transitively added through c\_definitions. add\_definitions(${c\_definitions}) # note: b's and boost's includes are transitively added through c\_include\_dirs. include\_directories(${c\_include\_dirs}) add\_library(${project\_name} shared ${cpp\_files}) # you could need `${xxx\_libraries}` here too, in case if the dependency # of a on c is not purely transitive in terms of xxx, but a explicitly requires # some additional symbols from xxx. however, in this example, i assumed that # this is not the case, therefore a is only linked against b and c. target\_link\_libraries(${project\_name} b c) # expose a's definitions (in this case only the ones of c transitively) # to other subprojects through cache variable. set(${project\_name}\_definitions ${c\_definitions} cache internal "${project\_name}: definitions" force) # expose a's public includes (including the ones of a's dependencies # transitively) to other subprojects through cache variable. set(${project\_name}\_include\_dirs ${project\_source\_dir}/include ${c\_include\_dirs} cache internal "${project\_name}: include directories" force) </code></pre><h1><code>cmakelists.txt</code> in <code>components/executable</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) project(executable c cxx) file(glob cpp\_files source/*.cpp) add\_definitions(${a\_definitions}) include\_directories(${a\_include\_dirs}) add\_executable(${project\_name} ${cpp\_files}) target\_link\_libraries(${project\_name} a c) </code></pre><hr><p>um es klar zu machen, hier ist die entsprechende quellbaumstruktur:</p><pre><code>root of the project ├───components │ ├───executable │ │ ├───resource │ │ │ └───icons │ │ ├───source | | └───cmakelists.txt │ ├───a │ │ ├───include │ │ │ └───a │ │ ├───source | | └───cmakelists.txt │ ├───b │ │ ├───include │ │ │ └───b │ │ ├───source | | └───cmakelists.txt │ └───c │ ├───include │ │ └───c │ ├───source | └───cmakelists.txt └───cmakelists.txt </code></pre><p>es gibt viele punkte, an denen dies angepasst/angepasst oder geändert werden kann, um bestimmte anforderungen zu erfüllen. dies sollte jedoch zumindest den einstieg erleichtern.</p><p><strong> hinweis: </strong>ich habe diese struktur in mehreren mittelgroßen und großen projekten erfolgreich eingesetzt.</p>
<p>der weg zu gehen ist das hochladen <strong>einmal für jede ubunt</strong> version.</p><p>launchpad erstellt keine pakete für ubuntu-versionen, die nicht mehr unterstützt werden, und erstellt nur ein paket für eine bestimmte ubuntu-version. die zielversion wird (wie sie bereits wissen) in der datei <code>changelog</code> durch den neuesten eintrag angegeben!</p><p>denken sie daran, dass die pakete, von denen ihr programm abhängt, möglicherweise nicht in allen ubuntu-versionen in derselben version verfügbar sind.</p><p>sie sprechen auch von "multi-architektur" (architektur = cup-typ, z. b. x86, lpia, amd64). dies macht keinen unterschied, da jedes hochgeladene paket für alle verfügbaren architekturen erstellt wird, solange sie <code>architecture: any</code> in der paketdefinition (<code>debian/control</code>) datei, dies ermöglicht ihnen auch, das paket von verschiedenen paketen für verschiedene architekturen abhängig zu machen (das paket muss mehrmals definiert werden)</p> <p>starten sie von <a href="http://www.ubuntu.com/server">buntu server</a> und bauen sie auf. es verwendet die gleichen repos wie die desktop-distribution und sie können verschiedene desktop-konfigurationen installieren.</p><p>ich schlage nur vor, dass sie sich von den großen metapaketen wie ubuntu-desktop fernhalten, oder sie werden am ende die vollständige distribution sehen.</p><p>wenn sie nur den ubuntu-desktop reduzieren (anstatt ihn aufzubauen) möchten, müssen sie ihn entfernen (was von vielen dingen abhängt) und alle automatisch erfüllten abhängigkeiten in manuell installierte konvertieren. wenn sie nicht dazu in der lage sind, bereinigen sie sie automatisch, da sie (neben anderen tools) "veraltete" pakete bereinigen. dies sind pakete, die keine abhängigkeit oder benutzerauswahl erfüllen.</p> hallo zusammen,

[bild] tobias:

dann werde ich noch manuell einen config-backup-download machen und den gleich wieder einspielen.

das funktioniert, also zumindest werden die interfaces nicht mehr durcheinander gewürfelt oder gar nicht initialisiert.

eventuell hat die opnsense ein problem unt… <p>c hat den vorteil, dass es eine relativ <strong> <em> kleine sprache</em> </strong> ist, was es <strong> macht ) <em> einfach einen c-compiler zu implementieren</em> </strong> (während ein c++ - compiler ein monster zum schreiben ist), und macht es <strong> = <em> leichter die sprache zu lernen</em> </strong>. siehe auch <a href="https://www.tiobe.com/tiobe-index/">tiobe-index</a> , wonach c etwas vor c++ liegt.</p><p>in (imo) abnehmender reihenfolge der rechtfertigung wird c immer noch häufig verwendet</p><ul> <li> <p>eingebettetes zeug<br> es ist viel einfacher, einen c-compiler auf eine kleine plattform zu portieren, als einen c++ - compiler zu portieren. außerdem behaupten c-befürworter, dass c++ "hinter ihrem rücken zu viel tut". allerdings imo das ist fud.</p> </li> <li> <p>systemprogrammierung<br> auch dies ist normalerweise auf die behauptung zurückzuführen, dass es einfacher ist, "zu wissen, was der compiler tut". viele eingebettete programme würden jedoch beispielsweise von vorlagen und anderen c++ - schlüsselfunktionen profitieren.</p> </li> <li> <p>quelloffene software<br> das ist jedoch meistens ein einstellungsproblem: oss hat c immer c++ vorgezogen (während es in großen teilen der branche das gegenteil ist). torvalds irrationaler hass könnte tatsächlich der wichtigste grund dafür sein <em> unter linux</em>.</p> </li> </ul> <p>wenn dies meine entwurfsentscheidung wäre, würde ich wahrscheinlich eher eine option c (modifizierte option a) wählen.</p><h3>erstens, warum nicht 'option b':</h3><p>zum einen gefällt mir die klarheit, dass jedes produkt seinen eigenen tisch hat. wenn es sich nur um eine große tabelle mit einem feld zur bestimmung des typs handelt, ist die beziehung nicht so klar.</p><p>zum anderen würde die indizierungsstrategie immer erfordern, dass dieses typfeld aufgelistet wird. da es sich nur um 4 typen handelt, ist die indexkardinalität extrem niedrig (<code>select * from product\_table where type='x'</code> führt im grunde sowieso einen vollständigen tabellenscan durch)</p><h3>option c.</h3><ul> <li>erstellen sie eine übergeordnete tabelle, die nur die spalten enthält, die alle typen gemeinsam nutzen</li> <li>erstellen sie jeden produkttyp als eigene tabelle mit ihren einzelnen spalten, mit einem zusätzlichen: ein link zur übergeordneten tabelle</li> <li>erstellen sie jede 'link'-tabelle: product\_option, model\_option usw. mit links zu den jeweiligen schlüsseln.</li> <li>für diejenigen mit wechselseitigen links (model\_option, option\_model) erstellen sie auch diese tabellen. dies erhöht die klarheit ihrer joins für alle, die sich das ansehen.</li> </ul><p>der nachteil ist die komplexität, sicherzustellen, dass waisen vermieden werden, wenn dinge aktualisiert/gelöscht werden, und zunächst die abfragen zu entwerfen, die diese tabellen verwenden.</p> Es lohnt sich, einen Blick auf diesen [`Blog Post`](http://lostechies.com/jimmybogard/2012/07/20/choosing-an-orm-strategy/) werfen, aber letztendlich werden die Kriterien von Ihnen festgelegt. Sie müssen entscheiden, ob 

* schnelle Entwicklung
* Performance
* Code-zuerst
* DB zuerst

 oder was auch immer Sie suchen und priorisieren Sie die Liste basierend auf, was noch wichtiger ist. Dann verwenden Sie diese Liste, um Ihre Forschung zusammenzustellen. eine individuell entwickelte webanwendung ist oft preiswerter als eine standardsoftware. ihr vorteil besteht darin, dass sie nur die kosten für die einmalige entwicklung der software investieren müssen. da sie zum eigentümer der software werden, entstehen keine weiteren lizenzkosten und zwar unabhängig von der benutzeranzahl und der dauer der nutzung. weitere informationen finden sie in unserem wiki-beitrag über die kosten einer individualsoftware (<https://www.trinidat.de/software-wiki/individualsoftware-kosten/>). >  Wenn Ihre Erweiterungen nicht aufgelistet sind, können Sie sie deinstallieren, indem Sie sie löschen. Sie können dies tun, indem Sie herausfinden, wo Ihre Erweiterungen auf Ihrem Computer installiert sind. Sie finden diese in Ihrem Chrome-Profil oder Sie können sie manuell in Ihrem Ordner Dokumente und Einstellungen suchen.
> 
>  

 <http://pcsplace.com/google/how-to-use-google-chrome-extensions-enable-install-remove-uninstall/> Jython Compiler bietet nicht viel Optimierungs Entscheidungen. Da jedoch die Java Virtual Machine (Java) und vielleicht Compiler (javac) im Backend oder zur Laufzeit aufgerufen zu werden, sollten Sie einen Blick auf sie nehmen.


Java hat unterschiedlichen Laufzeitschalter je nach verwenden, ob Sie es als Server-Prozess starten wollen, Client-Prozess, etc. Sie können auch, wie vielen Speicher sagen zuzuteilen. Mach es so:   

Lade Dir den kostenlosen Revo-Uninstaller runter. Wenn Du ihn installiert hast und öffnest, siehst Du alle bei Dir vorhandenen Programme, auch das Spiel. Klick auf das zu entfernende Programm, dann auf "Deinstallieren", nun auf die höchste, alle Reste entfernende Stufe 4 (die unterste). Dann nur noch den Anweisungen folgen, die in deutscher Sprache sind, fertig. So entfernst Du künftig jedes Programm rückstandsfrei.   

  

Mehr Info und sichere Downloadmöglichkeit:   

http://www.computerbild.de/download/Revo-Uninstaller-1553047.html   

  

Falls Du es wünscht, hier eine Anleitung:   

http://www.computerbild.de/download/Revo-Uninstaller-1553047-tutorial.html