Linker Probleme
-
Danke für deine Antwort, ich glaube, ich muss da ein paar Infos ergänzen.
Das ganze Projekt befindet sich in einer Projektgruppe und wird komplett aus der IDE gebaut. Die Projektgruppe enthält vier Projekte, die jeweils eine statische Bilbiothek erzeugen und ein Projekt, das die Anwendung erzeugt und die vier statischen Bibliotheken benötigt. Für jedes Projekt kann man individuell die Plattform festlegen, für das es erzeugt werden soll (Windows 32 Bit, Windows 64 Bit und Windows 64 Bit (Modern)). Ich baue alle Projekte für Windows 64 Bit und alle Projekte benutzen den gleichen Compiler und Linker. Eine Auswahl zwischen verschiedenen Standardbibliotheken, gegen die man linken kann, gibt es praktisch auch nicht (es gibt ne Ausnahme, aber die ist irrelevant). Die Anwendung wird ausschließlich statisch gelinkt, die Anwendung selbst braucht keine weiteren DLLs (mit Ausnahme der Postgres DLLs).
Die meisten dieser Linkerfehler kommen aus der Datei
libpqxx/pqxx/strconv.cxx
, da werden eigene stream-Klassen definiert, die vonstd::stringstream
erben.std::stringstream
selbst ist auch nur ein Spezialisierung vonstd::basic_stringstream
, was wiederum ein Template ist. So ganz bin ich von der fehlenden Instanziierung immer noch nicht weg.
Außerdem scheint ja ansonsten (std::string, std::vector, std::array, etc.) gefunden zu werden. Und letztendlich benutzt die Anwendung auch die STL, schon daher wird gegen sie gelinkt.
-
@DocShoe Auch wenn ich glaube, dass man nicht von Klassen der Standardbibliothek erben sollte (mit Ausnahme von vielleicht
std::exception
), glaube ich nicht wirklich dass das das Problem ist.Ich bin auch bei RAD Studio und dessen Compilern etwas überfragt (bin eher so ein Clang/GCC und CMake-Typ). Bei meinen Projekten hätte ich mir jetzt mal die Compiler-Kommandozeilen genau angesehen, ob da was komisches passiert und die auch mal "manuell" ausgeführt und dann ein paar Flags drangehängt (wie z.B. nochmal explizit die
libstdc++.a
/libc++.a
dazu linken, wo die Symbole eigentlich drin sein müssten und gucken, was passiert.Daher kann ich in dem Fall nur ne KI fragen. Vielleicht sind ja ein paar Tips in deren Antwort, die weiterhelfen:
KI-Antwort ---------------------------
This is a classic C++ linking issue with static libraries. The most common causes for this problem are:
Primary Causes:
- C++ Standard Library ABI Mismatch
- The static library (LIBPQXX) was compiled with a different C++ standard library version than your main project
- Different compiler versions or settings between the library and main project
- Mixing static and dynamic runtime libraries (e.g., one uses static CRT, the other uses dynamic)
- Compiler Version Incompatibility
- LIBPQXX was built with a different version of RAD Studio/C++ Builder
- Different C++ standard implementations (Dinkumware, libstdc++, etc.)
- Runtime Library Configuration
- Mismatch in runtime library settings (Debug vs Release, static vs dynamic)
- Different optimization settings or preprocessor definitions
RAD Studio Specific Solutions:
- Check Runtime Library Settings:
- Ensure both projects use the same runtime library:
- Project → Options → C++ Compiler → Classic Compiler → Runtime Library
- Both should use the same (e.g., "Dynamic RTL" or "Static RTL")
- Ensure both projects use the same runtime library:
- Verify Compiler Versions:
- Ensure both projects use the same compiler version
- Check Target Platform settings match
- Library Build Configuration:
- Rebuild LIBPQXX with the exact same RAD Studio version and settings as your main project
- Use the same build configuration (Debug/Release) for both
- Linker Options:
- Add proper library paths in:
- Project → Options → C++ Linker → Library Path
- Ensure all required C++ runtime libraries are linked
- Add proper library paths in:
Quick Diagnostic Steps:
- Check what's missing:
Shell:tdump -m LIBPQXX.A | grep precision
- Verify your project's runtime:
- Look for RLD* or similar symbols to identify runtime library version
- Common fix:
- Clean and rebuild both projects in the same IDE session
- Ensure no pre-built LIBPQXX binaries from different compiler versions
Prevention:
- Always build all static libraries with the same compiler version and settings
- Use package/project groups to ensure consistent build configurations
- Consider using dynamic libraries if you need to mix compiler versions
The key is consistency - every component must be built with identical compiler settings, especially the C++ runtime library configuration.
- C++ Standard Library ABI Mismatch
-
@DocShoe
Mal eine Frage. Benötigst du in deinem Workaround die Funktion die Funktionfix_win64_linker_issues()
überhaupt?BTW: Hast du mehrere Versionen von libpqxx? Nicht dass das folgende zutrifft:
Some users have reported problems using the above syntax, however, particularly when multiple versions of libpqxx are partially or incorrectly installed on the system. If you get massive link errors, try removing the "-lpqxx" argument from the command line and replacing it with the name of the libpqxx library binary instead. That's typically libpqxx.a, but you'll have to add the path to its location as well, e.g. /usr/local/pqxx/lib/libpqxx.a. This will ensure that the linker will use that exact version of the library rather than one found elsewhere on the system, and eliminate worries about the exact right version of the library being installed with your program..
-
Schau dir mal die Reihenfolge in der Linker Befehlszeile an, wie die Libs gelinkt werden: zuerst muß die
libpqxx
angegeben sein und dahinter dann erst die Standard C++ Library.
-
Kann ich fast alles ausschließen.
- Alle Projekte werden mit derselben Toolchain gebaut
- Alle Projekte werden im Release-Modus gebaut (auch wenn alle im Debug-Modus gebaut werden bekomme ich die Linker Fehler)
- Alle Projekte verwenden die gleiche Linkage (static), die Standardbibliotheken werden nicht statisch gelinkt.
- Es gibt nur eine libpqxx.a im Suchpfad für den Linker (hab sie umbenannt -> Linker kann Datei nicht finden -> Abbruch)
- Die cp64mt.a (ich vermute, dass das die Standard C++ Library ist) wird zuletzt angegeben.
-
@DocShoe
Hast du mal die Präprozessordefinitionen überprüft? Nicht dass z.B. ein gesetztes PQXX_AUTOLINK Probleme macht. Siehe header-pre.hxx
-
Vielen Dank für eure Antworten,
ich habe eure Vorschläge ausprobiert, doch nichts hat das Problem gelöst.
Ich hake das jetzt einfach mal als RAD Studio Macke ab, wäre nicht die erste. Vielleicht funktioniert's in der nächsten RAD Studio Version o.O
-
@DocShoe sagte in Linker Probleme:
Kann ich fast alles ausschließen.
- Alle Projekte werden mit derselben Toolchain gebaut
Schließt das die Libraries von PostgreSQL mit ein?
-
@john-0
Jein. Ich muss aus den Postgres DLLs Importbibliotheken für das RAD Studio erzeugen, da es keinen statischen Bibliotheken gibt, die mit dem RAD Studio kompatibel sind. Das ganze Projekt besteht aus diesen Dateien:Die Postgres Runtime Libraries, kommen als 64 Bit Version mit der Installation des Postgres DBMS, die baue ich nicht selbst:
- libqp.dll
- libssl-3-x64.dll
- libcrypto-3-x64.dll
Aus der libpq.dll erzeuge ich mit einem RAD Studio Tool (mkexp) eine Importbibliothek für das RAD Studio, die zur Laufzeit die DLL nachlädt und die entsprechenden Funktionen anspringt. Bei einer Größe von 14K kann da nicht viel mehr drinstecken.
- libpq.a (in meinem Fall libpq-17-2.a, weil ich die Versionsnummer gern im Namen haben möchte)
Das Minimalprojektgruppe besteht aus einem Projekt für eine statische Bibliothek, in der die libpqxx Dateien enthalten sind, dabei fällt dann diese Bibliothek raus:
- libpqxx.a
Außerdem gibt's dann die eigentlich Anwendung, die Klassen und Funktionen der libpqxx Bibliothek auf. Die main() Methode und den zugehörigen Code habe ich eingangs schon gepostet, da stehen auch die Linkeranweisungen für die beiden statischen Bibliotheken drin.
Die libpq.dll ist eine reine C Library und benötigt die MS Visual C Runtime, die zusammen mit dem Postgres DBMS automatisch installiert werden oder nachträglich manuell installiert werden müssen.
Sämtliche Quelltexte werden mit der gleichen Toolchain übersetzt und gelinkt. Ich seh da beim Besten will nichts Falsches oder zumindest etwas, das meine Probleme verursachen könnte.
-
@DocShoe sagte in Linker Probleme:
Das Minimalprojektgruppe besteht aus einem Projekt für eine statische Bibliothek, in der die libpqxx Dateien enthalten sind, dabei fällt dann diese Bibliothek raus:
- libpqxx.a
Es sieht so aus, dass die erstellte libpqxx noch immer unresolved symbols hat. Sprich Du musst beim Linken explizit die C++ Laufzeitbibliothek mit angeben, damit diese Symbole aufgelöst werden. Gut wäre es sich vorher die libpqxx.a anzuschauen, wie die Abhängigkeiten aussehen.