anderkve / FYS3150

https://anderkve.github.io/FYS3150
26 stars 14 forks source link

Problemer med armadillo på Mac M1 #30

Closed ungvilde closed 1 year ago

ungvilde commented 2 years ago

Hei!

jeg har fulgt instruksjonene for homebrew-installasjon av armadillo, og jeg har kjørt de ekstra linjene slik som det står i "Additional setup for M1 Mac users". Allikevel får jeg feilmelding når jeg prøver å kompilere:

Jeg kjører g++ -c test.cpp -larmadillo

Og får

clang: warning: -larmadillo: 'linker' input unused [-Wunused-command-line-argument]
test.cpp:3:10: fatal error: 'armadillo' file not found
#include <armadillo>
         ^~~~~~~~~~~
1 error generated.
anderkve commented 2 years ago

Hei @ungvilde!

Jeg har ingen M1 Mac å teste på, men ser kanskje ut som du har møtt på dette problemet: https://stackoverflow.com/questions/70248994/installing-armadillo-on-macos-with-homebrew

Basert på svaret på StackOverflow, forsøk å kjøre følgende kommando:

CPATH=/opt/homebrew/include LIBRARY_PATH=/opt/homebrew/lib g++ test.cpp -std=c++11 -larmadillo

Si i fra om det fungerer eller ikke. Hvis det fungerer så skal jeg legge til noen kommentarer på nettsiden basert på dette, samt denne https://apple.stackexchange.com/questions/414622/installing-a-c-c-library-with-homebrew-on-m1-macs som også diskuterer dette at g++ ikke finner mappene der homebrew installerer programmer.

ungvilde commented 2 years ago

Tusen takk @anderkve, det fungerer!

Men jeg har et par oppfølgingsspørsmål, hvis du har tid:

  1. Er det mulig å ordne slik ar det ikke er nødvendig å oppgi paths hver gang, så linjen ikke blir så lang?
  2. Er det nødvendig å spesifisere standard std=c++11? Eller kan jeg ordne så jeg slipper å skrive det? (Prøvde å fjerne den delen av linjen men fikk feilmelding)
  3. Når jeg kjører linja så får jeg en a.out-fil. Betyr det at jeg både kompilerer og linker med denne linja?
anderkve commented 2 years ago

Tusen takk @anderkve, det fungerer!

Så bra!

Er det mulig å ordne slik ar det ikke er nødvendig å oppgi paths hver gang, så linjen ikke blir så lang?

Jepp, det er mulig. Det er det som diskuteres i den andre linken jeg nevnte, https://apple.stackexchange.com/questions/414622/installing-a-c-c-library-with-homebrew-on-m1-macs Jeg skal skrive en liten oppskrift på det på nettsiden når jeg får tid.

Er det nødvendig å spesifisere standard std=c++11? Eller kan jeg ordne så jeg slipper å skrive det? (Prøvde å fjerne den delen av linjen men fikk feilmelding)

Ja, det er nødvendig å inkludere -std=c++11. (Eneste unntak er om du skulle ha en versjon av g++ eller clang der -std=c++11 er aktivert automatisk, men det virker ikke slik i ditt tilfelle.)

Generelt vil kompilering- og linkekommandoer bli veldig lange når man jobber med mer avanserte prosjekter. Derfor er det vanlig å bruke det vi kaller "Makefiles", som i praksis er små script som konstruerer de lange kommandoene. Til slutt ender man da opp med å bare kjøre en kommando make heller enn å skrive alle de lange kommandoene direkte. Vi har en kort intro til Makefiles her, i tilfelle du vil se på det alt nå: https://anderkve.github.io/FYS3150/book/using_make/intro.html

Men for relativt små prosjekter, som mye av det vi gjør i dette kurset, pleier jeg bare skrive et kort "shell-skript", altså et lite skript med terminalkommandoer. I ditt tilfelle kan du f.eks. lage en fil med navn som build.sh der innholdet i fila bare er den ene kommandoen

CPATH=/opt/homebrew/include LIBRARY_PATH=/opt/homebrew/lib g++ test.cpp -std=c++11 -larmadillo

Da kan du kjøre det skriptet med kommandoen ./build.sh, heller enn å skrive/lime inn hele kommandoen. Merk at du antakelig må kjøre kommandoen chmod u+x build.sh før du kan kjøre skriptet ditt for første gang -- se her for mer detaljer: https://anderkve.github.io/FYS3150/book/using_the_terminal/basics.html#run-programs-and-scripts

Når jeg kjører linja så får jeg en a.out-fil. Betyr det at jeg både kompilerer og linker med denne linja?

Jepp, riktig. Om du vil dele opp dette i først kompilering og så linking tror jeg det blir med følgende to kommandoer:

# kompilering
CPATH=/opt/homebrew/include g++ -c test.cpp -std=c++11

# linking
LIBRARY_PATH=/opt/homebrew/lib g++ test.o -larmadillo