C++ Libs
-
- Beiträge: 6910
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
C++ Libs
So wie mir bekannt ist, ist es noch nicht möglich C++ Libs in FPC einzubinden.
Kennt einer von euch bekannte C++ Libs ?
Mir kommt da gerade nur QT in den Sinn. Aber da gibt es eine Brücke zu FPC.
Kennt einer von euch bekannte C++ Libs ?
Mir kommt da gerade nur QT in den Sinn. Aber da gibt es eine Brücke zu FPC.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: C++ Libs
Ich habe einmal ein geht nicht bekommen mit dem Nachsatz, das es bei einigen Libs bedingt schon geht. Hängt vom C++ Compiler ab.
Ich weiß nur nicht mehr ob es hier oder im Englischen Forum war wo die Diskussion geführt wurde.
Ich weiß nur nicht mehr ob es hier oder im Englischen Forum war wo die Diskussion geführt wurde.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 954
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: C++ Libs
Tensorflow, OpenCV, LLVM und die Arduino Bibliotheken für avr-embedded.
FPC Compiler Entwickler
-
- Beiträge: 6910
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: C++ Libs
Stimmt, das ganze Arduino-Zeugs.Tensorflow, OpenCV, LLVM und die Arduino Bibliotheken für avr-embedded.
Dies wäre sicher noch praktisch, wen dies gehen würde.
So viel ich weis, ist die bei Arduino keine vollwertige Objektorientierung, so wie bei Desktop C++.
Auf dem AVR ist keine dynamische Speicherverwaltung möglich, somit können diese Objecte nur statisch verwendet werden.
Auf dem STM-32 sieht es schon ein wenig anders aus.
Die anderen Anwendungen musste ich erst googeln.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 6910
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: C++ Libs
Ist dies nicht etwa dies, wie es bei QT angewendet wird ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 954
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: C++ Libs
Nun, die Tatsache, dass die ganzen Objekte bei Arduino statisch sind, ist in dem Fall sogar ein Vorteil, weil dann FPC's nicht vollständige Unterstützung für cppclass genutzt werden kann. Für ein Beispiel siehe hier.Mathias hat geschrieben: So 27. Aug 2023, 13:05Stimmt, das ganze Arduino-Zeugs.Tensorflow, OpenCV, LLVM und die Arduino Bibliotheken für avr-embedded.
Dies wäre sicher noch praktisch, wen dies gehen würde.
So viel ich weis, ist die bei Arduino keine vollwertige Objektorientierung, so wie bei Desktop C++.
Auf dem AVR ist keine dynamische Speicherverwaltung möglich, somit können diese Objecte nur statisch verwendet werden.
Auf dem STM-32 sieht es schon ein wenig anders aus.

FPC Compiler Entwickler
-
- Beiträge: 6910
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: C++ Libs
Ich versuche gerade ein sehr einfache C++-lib einzubinden.
Der C++ Code hat genau eine Funktion:
Kompiliere ich die mit dem C-Compiler, funktioniert es einwandfrei.
Der Pascal-Code ist auch sehr einfach:
Kompiliere ich die lib aber mit C++, kann Lazarus dies nicht linken.
Es wird mit folgendem Fehler quittiert:
Gibt es eine Möglichkeit dies ganze zu überlisten.
Klassen kommen nicht vor, aber es werden sonstige Funktionen von C++ benötigt.
Wie vector und stream Zeugs.
Aber Pascal Seitig brauche ich nur einen einfachen Zugriff, wie im obigen Beispiel.
Der C++ Code hat genau eine Funktion:
Code: Alles auswählen
int myfunc() {
return 1234;
}
Code: Alles auswählen
gcc test.c -Wall -c
Code: Alles auswählen
program project1;
{$L test.o}
function myfunc(): Integer; cdecl; external;
begin
WriteLn(myfunc());
end.
Code: Alles auswählen
g++ test.c -Wall -c
Code: Alles auswählen
...
Verbose: Target OS: Linux for x86-64
Verbose: Compiling project1.lpr
Verbose: Linking /n4800/DATEN/Programmierung/mit_GIT/Lazarus/Tutorial/OpenGL_3.3/Versuche/Vulkan_Test/cpp_include/project1
Warning: linker: /usr/bin/ld.bfd: /n4800/DATEN/Programmierung/mit_GIT/Lazarus/Tutorial/OpenGL_3.3/Versuche/Vulkan_Test/cpp_include/lib/x86_64-linux/project1.o: in function `$main':
project1.lpr(6,0) Error: linker: undefined reference to `myfunc'
project1.lpr(7,1) Error: Error while linking
project1.lpr(7,1) Verbose: There were 1 errors compiling module, stopping
Verbose: Compilation aborted
Verbose: /home/tux/fpcupdeluxe_trunk/fpc/bin/x86_64-linux/ppcx64 returned an error exitcode
Klassen kommen nicht vor, aber es werden sonstige Funktionen von C++ benötigt.
Wie vector und stream Zeugs.
Aber Pascal Seitig brauche ich nur einen einfachen Zugriff, wie im obigen Beispiel.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: C++ Libs
Tippe mal auf
Hast du das PDF oben gelesen?
Code: Alles auswählen
extern "C"
-
- Beiträge: 6910
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: C++ Libs
Danke, jetzt gehts.
Code: Alles auswählen
extern "C"{
int myfunc() {
return 12345678;
}
}
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 6910
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: C++ Libs
Habe mich leider zu früh gefreut. Das einfache Programm ging.
Ich wollte die main mit meinem Programm verbinden, aber da macht leider "ld* nicht mit, es kommt eine riessen Schlange von Fehlern mit "undefined reference".
Pascal Seitig habe ich alle benötigten libs eingebunden, aber nützt leider nichts.
Die Liste habe ich vom ursprünglich C++ Kommando.
Zum nur eine main.o zu erzeugen habe ich folgend probiert, bringt auch nichts.
g++ main.c -lglfw -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi -Wall -c
Vorher hatte ich nur die gemacht;
Der C++ Compiler hat beides gefressen.
Dies mit dem EXPORTCALL habe ich auch probiert.
Bei Pascal habe ich noch dies probiert.
Da wrs es wenigsten übersichtlicher mit den Fehlern.
Dann verschwinden wenigsten alle "undefine reference".
Was kann ich noch probieren, das es geht ?
Der Aufwand, das ich das machen will, ich wollte ein fertiges C++ Vulkan-Programm schrittweise nach Pascal portieren.
Ich wollte die main mit meinem Programm verbinden, aber da macht leider "ld* nicht mit, es kommt eine riessen Schlange von Fehlern mit "undefined reference".
Code: Alles auswählen
...
// Das ganze C++ Programm
...
extern "C"{
int main1() {
printf("Hello World");
return 0;
}
}
extern "C"{
int main2() {
HelloTriangleApplication app;
try {
app.run();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
}
Code: Alles auswählen
program project1;
{$L main.o}
{$LinkLib c}
{$LinkLib glfw}
{$LinkLib vulkan}
{$LinkLib dl}
{$LinkLib pthread}
{$LinkLib X11}
{$LinkLib Xxf86vm}
{$LinkLib Xrandr}
{$LinkLib Xi}
function main1(): Integer; cdecl; external;
function main2(): Integer; cdecl; external;
begin
main1();
end.
Code: Alles auswählen
g++ main.c -o main -lglfw -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi
g++ main.c -lglfw -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi -Wall -c
Vorher hatte ich nur die gemacht;
Code: Alles auswählen
g++ main.c -Wall -c
Dies mit dem EXPORTCALL habe ich auch probiert.
Code: Alles auswählen
#define EXPORTCALL __attribute__((stdcall))
extern "C"{
extern int EXPORTCALL main1() {
printf("Hello World");
return 0;
}
}
Da wrs es wenigsten übersichtlicher mit den Fehlern.
Code: Alles auswählen
{$linklib stdc++}
Code: Alles auswählen
...
Verbose: Target OS: Linux for x86-64
Verbose: Compiling project1.lpr
Verbose: Linking /n4800/DATEN/Programmierung/mit_GIT/Lazarus/Tutorial/OpenGL_3.3/Versuche/Vulkan_Test/Webcam_Lazarus_and_c_lib/project1
Warning: linker: /usr/bin/ld.bfd: /n4800/DATEN/Programmierung/mit_GIT/Lazarus/Tutorial/OpenGL_3.3/Versuche/Vulkan_Test/Webcam_Lazarus_and_c_lib/main.o: undefined reference to symbol '_Unwind_Resume@@GCC_3.0'
Warning: linker: /usr/bin/ld.bfd: /lib/x86_64-linux-gnu/libgcc_s.so.1: Fehler beim Hinzufügen von Symbolen: DSO missing from command line
project1.lpr(21,1) Error: Error while linking
project1.lpr(21,1) Verbose: There were 1 errors compiling module, stopping
Verbose: Compilation aborted
Verbose: /home/tux/fpcupdeluxe_trunk/fpc/bin/x86_64-linux/ppcx64 returned an error exitcode
Der Aufwand, das ich das machen will, ich wollte ein fertiges C++ Vulkan-Programm schrittweise nach Pascal portieren.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 6910
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: C++ Libs
Ich bin einen Schritt weiter gekommen.
Lazarus scheitert, sobald ich vector<char> in der clib verwende.
Fehlermeldungen:
Ich vermute es liegt an diesem komischen DSO, was das auch immer ist.
Lazarus scheitert, sobald ich vector<char> in der clib verwende.
Code: Alles auswählen
#include <iostream>
#include <vector>
extern "C"{
void print() {
std::vector<char> buffer(1024);
printf("Hello\n");
}
}
Code: Alles auswählen
Projekt kompilieren, Ziel: /n4800/DATEN/Programmierung/mit_GIT/Lazarus/Tutorial/OpenGL_3.3/Versuche/Vulkan_Test/cpp_include/project1: Exit code 1, Fehler: 1, Warnungen: 2, Hinweise: 2
Warning: linker: /usr/bin/ld.bfd: /n4800/DATEN/Programmierung/mit_GIT/Lazarus/Tutorial/OpenGL_3.3/Versuche/Vulkan_Test/cpp_include/test.o: undefined reference to symbol '_Unwind_Resume@@GCC_3.0'
Warning: linker: /usr/bin/ld.bfd: /lib/x86_64-linux-gnu/libgcc_s.so.1: Fehler beim Hinzufügen von Symbolen: DSO missing from command line
Hint: Start of reading config file /home/tux/fpcupdeluxe_trunk/fpc/bin/x86_64-linux/fpc.cfg
Hint: End of reading config file /home/tux/fpcupdeluxe_trunk/fpc/bin/x86_64-linux/fpc.cfg
Target OS: Linux for x86-64
Compiling project1.lpr
Linking /n4800/DATEN/Programmierung/mit_GIT/Lazarus/Tutorial/OpenGL_3.3/Versuche/Vulkan_Test/cpp_include/project1
project1.lpr(11,1) Error: Error while linking
project1.lpr(11,1) Verbose: There were 1 errors compiling module, stopping
Verbose: Compilation aborted
Verbose: /home/tux/fpcupdeluxe_trunk/fpc/bin/x86_64-linux/ppcx64 returned an error exitcode
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 954
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: C++ Libs
DSO steht für Dynamic Shared Object und ist nichts anderes als der offizielle Begriff für Bibliotheken. Und der Fehler sagt dir einfach, dass der Linker das Symbol Unwind_Resume nicht innerhalb der angegebenen Bibliotheken finden kann. Dieses Symbol befindet sich in der statischen Bibliothek libgcc_eh.a. Wenn du diese also auch noch per $LinkLib angibst (also gcc_eh), dann sollte es funktionieren (GCC gibt diese noch zusätzlich automatisch an den Linker weiter).
FPC Compiler Entwickler
-
- Beiträge: 6910
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: C++ Libs
Danke jetzt geht's.
Jetzt wird der Code wenigsten anstandslos kompiliert.
Aber der Versuch, der C++ Teil der Vulkan-Source will immer noch nicht ganz.
Das original Programm mit C++ mit folgender main() läuft einwandfrei.
Ersetzt ich die main() durch main2(), un compiliere ich es nur als *.o dann läuft die Inizialisirung von Vulkan bis zu einem gewissen Punkt durch, aber wird leider mit einer Speicherverletzung abgebrochen.
Fehler mit FPc-Programm als Baisi:
Will ich nur die main.o, dann kompiliere ich es so:
Will ich aber ein ausführbares Prgramm, dann mache ich es so:
Dies ist der Pascal Teil. Ich habe da mal die unit math eingebunden, ob dann SetExceptionMask(...) etwas bringt, bei gtk2 hat dies schon geholfen.
Hat wer noch eine Idee, was unter einem C++ anders ist, als mit der Verbindung mit der Pascal-Source ?
An der Schutzverletzung an, könnte es ein anderes Speichermodell oder sonst was sein.
Wen ich ein reines FPC-Programm habe, wird mit "Runtime error 216..." quittiert.
Und bei einem reinem C++ Programm meistens "Abgebrochen (Speicherabzug geschrieben)"
Jetzt wird der Code wenigsten anstandslos kompiliert.
Aber der Versuch, der C++ Teil der Vulkan-Source will immer noch nicht ganz.
Das original Programm mit C++ mit folgender main() läuft einwandfrei.
Code: Alles auswählen
int main() {
HelloTriangleApplication app;
try {
app.run();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
Code: Alles auswählen
extern "C"{
extern int main2() { // neu
HelloTriangleApplication app;
try {
app.run();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
}
Code: Alles auswählen
validation layer: vkCreateSwapchainKHR: Driver's function pointer was NULL, returning VK_SUCCESS. Was the VK_KHR_swapchain extension enabled?
ERROR: vkCreateSwapchainKHR: Driver's function pointer was NULL, returning VK_SUCCESS. Was the VK_KHR_swapchain extension enabled?
Abgebrochen (Speicherabzug geschrieben)
Code: Alles auswählen
g++ main.c -lglfw -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi -Wall -c
Code: Alles auswählen
g++ main.c -o main -lglfw -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi
Code: Alles auswählen
program project1;
uses
Math;
{$linklib stdc++}
//{$linklib gcc_s}
{$linklib gcc_eh}
{$LinkLib c}
{$LinkLib glfw}
{$LinkLib vulkan}
//{$LinkLib dl}
//{$LinkLib pthread}
//{$LinkLib X11}
//{$LinkLib Xxf86vm}
//{$LinkLib Xrandr}
//{$LinkLib Xi}
{$L main.o}
//function main1(): Integer; cdecl; external;
function main2(): Integer; cdecl; external;
begin
SetExceptionMask([exDenormalized, exInvalidOp, exOverflow, exPrecision, exUnderflow, exZeroDivide]);
// main1();
main2();
end.
An der Schutzverletzung an, könnte es ein anderes Speichermodell oder sonst was sein.
Wen ich ein reines FPC-Programm habe, wird mit "Runtime error 216..." quittiert.
Und bei einem reinem C++ Programm meistens "Abgebrochen (Speicherabzug geschrieben)"
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot