Compilazione g++ e make file

di il
2 risposte

Compilazione g++ e make file

Salve a tutti, scrivo sperando di ricevere aiuto su un software che non riesco a far girare, spiego:
Sto cercando di leggere i dati che viaggiano su un bus NMEA2000, collegando al bus una shield apposita, per Raspberry Pi: fin qui, tutto liscio, configurato Raspberry, la shield legge i dati del protocollo Can, che viaggiano sul bus.

Premetto che la shield è ben documentata e ci sono guide e librerie già scritte per fare questa cosa, quindi non dovrei star facendo nulla di nuovo.

Ora devo utilizzare le librerie C scritte per questa shield per ottenere i dati convertiti che mi servono, il problema è che anche seguendo passo passo le istruzioni mi trovo difronte ad un problema che non riesco a risolvere... innanzitutto linko la documentazione :

https://github.com/thomasonw/NMEA200
https://github.com/thomasonw/NMEA2000_socketCA

A quanto ho capito, la seconda va ad integrazione della prima, ed è proprio lì che sorge il mio problema.

Dopo aver configurato Raspberry ho eseguito questi passaggi:
Ho creato una cartella inserendoci tutto il contenuto della sottocartella "src" che si trova tra i file della libreria NMEA2000, poi ho aggiunto a questi file, anche i due file della libreria NMEA2000_socketCAN, ho eseguito lo script cmake.sh, generando in questo modo la libreria "libnmea2000.a".

Creato il file main.cpp:
/* 
 * File:   main.cpp
 * Author: al
 *
 * Testing for CAN and RPI 
 * 
 * See: https://github.com/thomasonw/NMEA2000_socketCAN
 *
 * Created on February 12, 2017, 2:37 PM
 */

#include <cstdlib>
#include <stdio.h>
#include <iostream>
#include "NMEA2000_CAN.h"

using namespace std;

int main(void)
{
    cout << "Starting CAN watching" << endl;

    setvbuf (stdout, NULL, _IONBF, 0);                                          // No buffering on stdout, just send chars as they come.
 
    NMEA2000.SetForwardStream(&serStream);                                      // Connect bridge function for streaming output.
    NMEA2000.SetForwardType(tNMEA2000::fwdt_Text);                              // Show in clear text (for now)
       
    if (!NMEA2000.Open()) {									// Defaults to port can0, see ref for how to use other ports
       cout << "Failed to open CAN0 port" << endl;
       return 1;
   }
    
    cout  << endl << "CAN started, going to watch it now" << endl;

     while(1) {
         NMEA2000.ParseMessages();                                               // Will send out CAN messages in open text 
    }
    
    return 0;
}
In allegato, ho inserito lo screen del comando che ho utilizzato per il compilatore con il relativo errore... è come se non collegasse al file main.cpp, la libreria di supporto NMEA2000_SocketCAN.cpp.

Non sono molto pratico con il compilatore G++, magari c'è qualcuno con più esperienza a riguardo?
Allegati:
31250_7a18013b384d439a4caf50628410e574.png
31250_7a18013b384d439a4caf50628410e574.png

31250_8b1bbc8284d1962cd0b7f10276148b49.png
31250_8b1bbc8284d1962cd0b7f10276148b49.png

2 Risposte

  • Re: Compilazione g++ e make file

    È un po' un... casino, ma con calma si può sistemare.

    Se ben comprendo vuol compilare un programma che usa la libreria.
    Bene, per cominciare suggerisco di estrarre in una singola cartella la cartella src (coi file .h e .cpp).
    Può anche fare un vero Makefile, piuttosto che a "mano".
    Nel secondo caso -l è una istruzione del linker, serve per linkare una libreria in formato oggetto già esistente, e direi che non le interessa farlo.

    Dunque per un principiante partirei (mettendo tutto nella stessa cartella) con un
    
    g++ main.cpp -I.
    
    Il -I serve per dire "cerca i file da includere" nel . (cioè nella cartella locale).
    Manca -o (per scrivere in output l'eseguibile), manca un -Os o -O3 o quello che le pare, per iniziare.

    Attenzione però, il file NMEA2000_CAN.h include il file SPI.h (sarà qualche altro software) che andrà pure esso reperito.
    Una volta messi tutti dentro (gli include e i .cpp) riuscirà a compilare, a quel punto metterà in output l'eseguibile (con -s per strippare i simboli e così via)

    Perchè ci vuole SPI.h (che è una libreria di Arduino per quanto mi consta)
    mcp_can.h preso da https://github.com/ttlappalainen/CAN_BUS_Shiel
    NMEA2000_mcp.h


    In sostanza
    1) si compila "a vuoto"
    2) si vedono i file include necessari e mancanti
    3) li si reperiscono, mettendoli sempre nella stessa cartella (sempre in fase di principiante)
    4) si compila di nuovo, si reperiscono i file mancanti etc... insomma si cicla fino a quando non finiscono
    5) a quel punto si fa l'eseguibile, tipo
    
    g++ -O3 -s main.cpp -o compilato.exe
    
    Se vengono usate librerie "vere" (tipo pthread o quel che sono) vanno indicati al linker (ulteriori parametri di g++)

    Come si fa a trovare un include strano?
    Semplice, con zio google.
    Normalmente dirà qual'è il software, o la libreria, relativa

    Qualche altro suggerimento: in questo caso invece di un makefile hanno messo un cmake, e vabbè
    CMakeLists.txt
    Li vedrà che non serve nulla di particolare, se non
    
    add_compile_options(
      -Wall
      -Werror
      -std=c++11
      -g
    )
    
    enable_testing()
    
    add_subdirectory(src)
    add_subdirectory(third-party/catch)
    add_subdirectory(test)
    un -std=c++11
    E' importante, vengono usati evidentemente costrutti del tipo vettore di qualcosa, per i quali se nel g++ non aggiunge in coda -std=c++11 non riuscirà a compilare (capita ad esempio sempre col malefico MacOS, ma non è questo il caso, è solo analogo)
  • Re: Compilazione g++ e make file

    Grazie per la risposta, alla fine sono riuscito a risolvere. In pratica in alcune librerie, c'erano riferimenti ad altre librerie e file presenti nella cartella, solo che in molti casi la dichiarazione è stata fatta con "#include <nomelibreria>" dunque in fase di compilazione, si andava a ricercare quel determinato file nella cartella predefinita di sistema, anziché nella cartella del progetto. Sistemando gli "include" sono riuscito a compilare senza problemi.
Devi accedere o registrarti per scrivere nel forum
2 risposte