È 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)