[C] Eclipse en gebruik van externe library

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • M4RTiN
  • Registratie: Augustus 2000
  • Laatst online: 24-11-2024
Ik ben mijn eerstje stapjes in C code aan het maken. Ik heb een Simatic 2040 aangeschaft, ze bieden hier een crosscompile situatie bij aan. Ik heb een howto gevolgd en het lukt prima om een blink example te compilen en te draaien op het apparaatje.

Nu wil ik graag een project starten waarbij ik de com poorten gebruik als modbus RTU. Nu heb ik de volgende code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using namespace std;
#include "mraa.hpp"
#include "modbus.h"

using namespace mraa;


int main(void) {
cout << "Hello IOT2000." << endl;

Gpio* d_pin = NULL;
d_pin = new mraa::Gpio(13, true, false);
d_pin->dir(mraa::DIR_OUT);

modbus_t *ctx;

ctx = modbus_new_rtu("/dev/ttyS2", 115200, 'N', 8, 1);
if (ctx == NULL) {
fprintf(stderr, "Unable to create the libmodbus context\n");
return -1;
}

for (;;) {
d_pin->write(1);
cout << "aan" << endl;
sleep(1);
d_pin->write(0);
cout << "uit" << endl;
sleep(1);
}
return 0;
}


En dit geeft de volgende fout aan bij compilen:

code:
1
C:\Users\martin\workspace_iot\iot_test\IOT2000 Release/..\example.cpp:18: undefined reference to `modbus_new_rtu'


Ik snap hierdoor dat de bibliotheek niet goed geladen wordt. Ik heb echter wel geprobeerd dit goed in te stellen door in Eclipse de Project Compiler en Project Linker van de juiste bibliotheken en paden.

Ik gebruik in ieder geval de volgende bibliotheek: http://libmodbus.org/

Ik heb geprobeerd de tips van deze pagina toe te passen: https://www.eclipse.org/forums/index.php/t/238028/

code:
1
2
3
4
5
6
Here are steps to add an external library
http://wiki.eclipse.org/CDT/User/FAQ#How_do_I_add_an_external_library_to_my_C.2B.2B_project.3F

1) in Properties>>C/C++ Build>>Settings>>GCC C++ Compiler >> Includes you must add the include path for the external library (where the header reside). This information is needed by the Eclipse indexer (code completion etc.) and the compiler

2) Properties>>C/C++ Build>>Settings>>GCC C++ Linker >> Libraries you must add the library search path (option -L) and the library you want to link against (option -l). This info is needed for the linker.


Ik heb vooral het idee dat het misgaat bij project linker settings, ik heb het nu ingesteld staan als de volgende flags:

code:
1
 -lmraa -fno-use-linker-plugin -LC:\Users\martin\workspace_iot\libmodbus-3.1.4\src\

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 27-09 13:03
De foutmelding wordt inderdaad veroorzaakt door een linkerfout, maw headers etc kan hij vinden maar niet de library waarin deze functie is gedefinieerd.
Ik mis op je linker commandline nog een
code:
1
 -lmodbus
o.i.d (afhankelijk van hoe de library heet). Vergelijk het met met de -lmraa optie, deze laatste zal proberen libmraa.a/.lib mee te linken.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • M4RTiN
  • Registratie: Augustus 2000
  • Laatst online: 24-11-2024
Ah, daar heb ik inderdaad ook nog mee zitten spelen. Maar dat hielp tot zo ver ook nog niet. Maar ik wist ook nog niet zeker naar wat voor bestanden hij zou gaan zoeken.

code:
1
c:/users/martin/iot_sdk/sysroots/i686-pokysdk-mingw32/usr/bin/i586-poky-linux/../../libexec/i586-poky-linux/gcc/i586-poky-linux/5.3.0/real-ld.exe: cannot find -lmodbus


Wat jij nu beschrijft (het linken naar een .lib of een .a bestand) is vermoedelijk de echte reden in mijn geval. De bibliotheek verschaft deze namelijk niet.

Ik heb hier ook al het één en ander over geprobeerd te zoeken, en ik acht de kans groot dat ik op mijn windows pc deze .a files zelf moet compileren? Met als doelbestemming voor het linux iot2040 architectuur ?

Kortom als ik deze .a bestanden mis (of .lib) hoe geraak ik er dan aan als de bibliotheek ze niet verschaft ?

[ Voor 12% gewijzigd door M4RTiN op 20-10-2017 13:37 ]


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 27-09 13:03
M4RTiN schreef op vrijdag 20 oktober 2017 @ 13:21:
Kortom als ik deze .a bestanden mis (of .lib) hoe geraak ik er dan aan als de bibliotheek ze niet verschaft ?
Door de genoemde bibliotheek zelf te builden. Instructies daarvoor staan hier

[edit]
Misschien dat het het makkelijjkt is om een cross compile VM te maken met een Linux smaak, Linux software bouwen op een Windows bak zuigt.

[ Voor 17% gewijzigd door farlane op 20-10-2017 17:02 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • M4RTiN
  • Registratie: Augustus 2000
  • Laatst online: 24-11-2024
Bedankt, ik was inderdaad al blij dat ik de foutmelding eindelijk had kunnen repareren door via MingW op de windows ontwikkelbak eindelijk zelf .a files te kunnen genereren.

Bleek vervolgens ondanks de foutmelding dat libmodbus niet gevonden werd verholpen was, alsnog weer de melding undefined reference to `modbus_new_rtu' naar voren kwam. Ik ben toen eens gaan vergelijken naar wat voor soort bestanden er in de map staan van de mraa bibliotheek. Toen zag ik dat daar *.so files in stonden. Dit herken ik als statische bibliotheken van linux, dus mijn gezonde verstand deed mij beseffen dat ik die bibliotheek moest gaan cross compilen.

Dit heb ik geprobeerd via
code:
1
$ ./configure --enable-static=yes --host=i686-pc-linux-gnu --build=i586-mingw32


Maar zoals je aangaf is dit waarschijnlijk niet een hele makkelijke manier omdat de standaard configure/build scripts het gebruik van de standaard C bibliotheek dan willen gebruiken en via MingW wordt dan via een eigen *.dll gedaan.

Omdat ik niet wist hoe ik dit moet omzeilen doe ik nu een poging om de bibliotheek op de iot2040 zelf te gaan compileren. Zal waarschijnlijk niet snel gaan, maar is hopenlijk wel de oplossing!

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 27-09 13:03
Dat kan inderdaad ook en is wel aardig om snel te kunnen testen, maar is niet ideaal omdat het waarschijnlijk minder krachtig is, en je storage kwijt bent aan de libraries & binaries om te kunnen builden. Bovendien wordt je target na verloop van tijd (misschien dat je nog meer libraries nodig gaat hebben, wie weet) best wel een chaos.

Kortom, voor een snelle test is het prima, maar ik zou wel een systeem inrichten (echt dan wel virtueel) waarop je kunt cross compilen voor je target.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • M4RTiN
  • Registratie: Augustus 2000
  • Laatst online: 24-11-2024
Bedankt farlane, het is nu gelukt. Ik denk dat je voor grotere builds zeker gelijk hebt. Maar zoals je al aan geeft, voor dit testje ging het toch nog snel en prima! Eindelijk de foutmelding weggewerkt :D
Pagina: 1