2016-06-20 14 views
1

Ich habe eine Qt-Anwendung, die die Boost-Logger-Bibliothek verwendet. Ich möchte es zu einem Standalone machen. Nachdem ich jedoch die Bibliotheken für die statische Verknüpfung verwaltet habe, ist die Anwendung immer noch auf Boost-Bibliotheken angewiesen. Die Bibliotheken, die ich enthalten sind:Boost Logger Statische Verknüpfung: funktioniert nicht

..../boost_1_61_0_b1/stage/lib/libboost_regex.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_log_setup.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_thread.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_log.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_system.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_filesystem.a 

Die Anwendung wird compiliert (nach unzähligen Versuchen). Wenn ich jedoch das LDD-Tool verwende, werden Boost-Bibliotheken in der Abhängigkeitsliste angezeigt.

Hinweis: Ich muss BOOST_ALL_DYN_LINK definieren. Andernfalls wird nicht verlinkt.

Gibt es eine Möglichkeit, dieses Makro nicht zu verwenden und das Abhängigkeitsproblem zu überwinden? Wenn nicht, welche Lösungen schlagen Sie vor, um dieses Problem zu umgehen?

+1

Kompilieren Sie alle Boost-Bibliotheken als statische Bibliotheken an erster Stelle. Ich bin mir ziemlich sicher, dass es eine bjam-Option gibt, die Sie auch verwenden können, um das zu erreichen. –

+0

Aber ich habe beide .a und .so Dateien unter/stage/libs. Soll ich sie abspalten? –

Antwort

0

Standardmäßig auf modernen UNIX-ähnlichen Systemen standardmäßig gcc Links mit gemeinsamen Bibliotheken. Um statische Verknüpfungen zu erzwingen, können Sie entweder -static zu Ihrer verbindenden Befehlszeile hinzufügen (siehe docs) oder sicherstellen, dass gcc die gemeinsam genutzten Bibliotheken nicht findet, sondern nur die statischen Bibliotheken findet (z. B. die gemeinsam genutzten Bibliotheken in ein separates Verzeichnis verschieben) Verknüpfen Sie Ihr Projekt. Beachten Sie, dass -static alle Bibliotheken statisch verknüpft, einschließlich libstdC++.

Alternativ können Sie die statischen Bibliotheken direkt angeben, ohne den Schalter -l. Sie werden den vollständigen Pfad zu den Bibliotheken jedoch verwenden müssen, so dass anstelle von

gcc ... -lboost_log ...

würden Sie

gcc ... ..../boost_1_61_0_b1/stage/lib/libboost_log.a ...

Auf jeden Fall schreiben, sollten Sie nicht BOOST_ALL_DYN_LINK definieren, da diese Makro bedeutet genau das gegenüber - dass Sie beabsichtigen, mit Boost shared Bibliotheken zu verknüpfen.

+0

Ich habe versucht, bjam -static, dann habe ich mit den .a-Bibliotheken verbunden und es hat funktioniert. Ich weiß nicht, ob es ein Qt. Pro-Problem oder was ist, aber es scheint, dass, wenn es beide .a und .so Bibliotheken im selben Pfad gab, es mit dem .so verbindet, selbst wenn es anders angegeben ist. Trotzdem danke –