C++ Libs

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

C++ Libs

Beitrag von Mathias »

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.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6216
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

Beitrag von af0815 »

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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: C++ Libs

Beitrag von theo »


PascalDragon
Beiträge: 834
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

Beitrag von PascalDragon »

Mathias hat geschrieben:
So 27. Aug 2023, 08:58
Kennt einer von euch bekannte C++ Libs ?
Tensorflow, OpenCV, LLVM und die Arduino Bibliotheken für avr-embedded.
FPC Compiler Entwickler

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C++ Libs

Beitrag von Mathias »

Tensorflow, OpenCV, LLVM und die Arduino Bibliotheken für avr-embedded.
Stimmt, das ganze Arduino-Zeugs.
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

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C++ Libs

Beitrag von Mathias »

theo hat geschrieben:
So 27. Aug 2023, 11:41
https://downloads.freepascal.org/fpc/do ... Pascal.pdf
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

PascalDragon
Beiträge: 834
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

Beitrag von PascalDragon »

Mathias hat geschrieben:
So 27. Aug 2023, 13:05
Tensorflow, OpenCV, LLVM und die Arduino Bibliotheken für avr-embedded.
Stimmt, das ganze Arduino-Zeugs.
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.
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. ;)
FPC Compiler Entwickler

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C++ Libs

Beitrag von Mathias »

Ich versuche gerade ein sehr einfache C++-lib einzubinden.
Der C++ Code hat genau eine Funktion:

Code: Alles auswählen

int myfunc() {
  return 1234;
}
Kompiliere ich die mit dem C-Compiler, funktioniert es einwandfrei.

Code: Alles auswählen

gcc test.c -Wall -c
Der Pascal-Code ist auch sehr einfach:

Code: Alles auswählen

program project1;
{$L test.o}
function myfunc(): Integer; cdecl; external;
begin
  WriteLn(myfunc());
end.   
Kompiliere ich die lib aber mit C++, kann Lazarus dies nicht linken.

Code: Alles auswählen

g++ test.c -Wall -c
Es wird mit folgendem Fehler quittiert:

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
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.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: C++ Libs

Beitrag von theo »

Tippe mal auf

Code: Alles auswählen

extern "C"
Hast du das PDF oben gelesen?

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C++ Libs

Beitrag von Mathias »

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

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C++ Libs

Beitrag von Mathias »

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".

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;
  }
}
Pascal Seitig habe ich alle benötigten libs eingebunden, aber nützt leider nichts.

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.         
Die Liste habe ich vom ursprünglich C++ Kommando.

Code: Alles auswählen

g++ main.c -o main -lglfw -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi 
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;

Code: Alles auswählen

g++ main.c -Wall -c
Der C++ Compiler hat beides gefressen.

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;
  }
}
Bei Pascal habe ich noch dies probiert.
Da wrs es wenigsten übersichtlicher mit den Fehlern.

Code: Alles auswählen

{$linklib stdc++}
Dann verschwinden wenigsten alle "undefine reference".

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
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.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C++ Libs

Beitrag von Mathias »

Ich bin einen Schritt weiter gekommen.
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");
  }
}
Fehlermeldungen:

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
Ich vermute es liegt an diesem komischen DSO, was das auch immer ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 834
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

Beitrag von PascalDragon »

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

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C++ Libs

Beitrag von Mathias »

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.

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;
  }
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.

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;
  }
}
Fehler mit FPc-Programm als Baisi:

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)
Will ich nur die main.o, dann kompiliere ich es so:

Code: Alles auswählen

g++ main.c -lglfw -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi -Wall -c
Will ich aber ein ausführbares Prgramm, dann mache ich es so:

Code: Alles auswählen

g++ main.c -o main -lglfw -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi 
Dies ist der Pascal Teil. Ich habe da mal die unit math eingebunden, ob dann SetExceptionMask(...) etwas bringt, bei gtk2 hat dies schon geholfen.

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.     
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)"
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten