Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MAC OSX install Instructions #34

Open
never00rei opened this issue Dec 17, 2023 · 13 comments
Open

MAC OSX install Instructions #34

never00rei opened this issue Dec 17, 2023 · 13 comments

Comments

@never00rei
Copy link

The OSX Install instructions are incorrect, if you're using brew to install ncurses - you should use the following flags:

export LDFLAGS="-L/usr/local/opt/ncurses/lib"
export CPPFLAGS="-I/usr/local/opt/ncurses/include"

Your README is incorrectly stating:

export LDFLAGS="-L/opt/homebrew/opt/ncurses/lib"
export CPPFLAGS="-I/opt/homebrew/opt/ncurses/include"
@AlKhrulev
Copy link

To be fair, the previous instructions are for Intel Macs, while the new ones are for ARM ones. I would leave both for users to choose from

@realhackcraft
Copy link

realhackcraft commented Jul 10, 2024

@never00rei Have you succeeded in compiling for Mac with M1 series? I keep getting

ld: symbol(s) not found for architecture arm64

I tried the official release as well as cloning the repo, but the linker fails in both cases.

@AlKhrulev
Copy link

@realhackcraft I've compiled for M3 Max recently without any issues. Are you using clang or gcc?

@realhackcraft
Copy link

realhackcraft commented Jul 12, 2024

@AlKhrulev I'm not sure. I was following the instructions on the readme and ran:

./configure
make
sudo make install

Edit: I am using clang++.

clang++: error: linker command failed with exit code 1 (use -v to see invocation)

I'm on M2

@kr4t0z
Copy link

kr4t0z commented Jul 13, 2024

@realhackcraft I'm facing the same issue as you.

I'm on M2 Pro

@AlKhrulev
Copy link

@realhackcraft @kr4t0z to double-check, you have downloaded a different ncurses implementation, say via Homebrew's brew install ncurses and ran all command with the following set up?

export LDFLAGS="-L/opt/homebrew/opt/ncurses/lib"
export CPPFLAGS="-I/opt/homebrew/opt/ncurses/include"

I've just placed this before ./configure; make; sudo make install in the same shell script and ran the whole thing together. Give it a try and let me know

@realhackcraft
Copy link

Warning: ncurses 6.5 is already installed and up-to-date.

And I made sure to run those two lines just before running ./configure

Perhaps the M2 series has some problems, or maybe because my SIP is disabled.

@realhackcraft
Copy link

Is there a way of enabling verbose mode on clang++ from the make file? I don't know which one to edit.

@AlKhrulev
Copy link

@realhackcraft I've looked through the original INSTALL file, and it looks like you can pass customs compiler flags to ./configure. This is a just a sample example below:

./configure CXXFLAGS="-Os -march=native -mtune=native -DNDEBUG -fno-exceptions -ffunction-sections -fdata-sections -flto" LDFLAGS="-Wl,--gc-sections -flto" CXX="clang++"
make -j3
sudo make install-strip

I would probably assume that you can try something like ./configure CXXFLAGS="-v" CXX="clang++" to get verbose output and try to identify the problem

@realhackcraft
Copy link

I added the verbose output flag and tried to compile it, but it still showed clang++: error: linker command failed with exit code 1 (use -v to see invocation), so I'm not sure if ./configure CXXFLAGS="-v" CXX="clang++" made a diffrence.

Upon inspecting the error closer, it appears that _endwin$NCURSES60, _init_color$NCURSES60, _init_pair$NCURSES60 and many more ncurses function are undefined, for some reason. I have cded into /usr/local/opt/ncurses/include and confirmed that the header files are there. In the /lib directory, all the .o binaries are present too.

When I removed the LDFLAGS and CPPFLAGS, the linker complains that COLOR and various other ncurses macros are undefined, which is expected.

Full log
Making all in doc
make[1]: Nothing to be done for `all'.
Making all in src
clang++ -std=gnu++11 -DNCURSES_WIDECHAR -std=c++11 -v  -L/opt/homebrew/opt/ncurses/lib -o neo cloud.o droplet.o neo.o  -lncursesw
Apple clang version 16.0.0 (clang-1600.0.22.7)
Target: arm64-apple-darwin24.0.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
 "/Library/Developer/CommandLineTools/usr/bin/ld" -demangle -lto_library /Library/Developer/CommandLineTools/usr/lib/libLTO.dylib -dynamic -arch arm64 -platform_version macos 15.0.0 15.0 -syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -mllvm -enable-linkonceodr-outlining -o neo -L/opt/homebrew/opt/ncurses/lib -L/usr/local/lib cloud.o droplet.o neo.o -lncursesw -lc++ -lSystem /Library/Developer/CommandLineTools/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture arm64:
  "_endwin$NCURSES60", referenced from:
      Cleanup() in neo.o
      ParseArgs(int, char**, Cloud*, double*, bool*) in neo.o
      ParseArgs(int, char**, Cloud*, double*, bool*) in neo.o
      ParseArgs(int, char**, Cloud*, double*, bool*) in neo.o
      _main in neo.o
  "_init_color$NCURSES60", referenced from:
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      ...
  "_init_pair$NCURSES60", referenced from:
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      ...
  "_initscr$NCURSES60", referenced from:
      InitCurses(ColorMode, ColorMode*) in neo.o
  "_keypad$NCURSES60", referenced from:
      InitCurses(ColorMode, ColorMode*) in neo.o
  "_refresh$NCURSES60", referenced from:
      InitCurses(ColorMode, ColorMode*) in neo.o
      Profiler(Cloud&) in neo.o
      MainLoop(Cloud&, double) in neo.o
  "_start_color$NCURSES60", referenced from:
      InitCurses(ColorMode, ColorMode*) in neo.o
  "_use_default_colors$NCURSES60", referenced from:
      Cloud::SetColor(Color) in cloud.o
  "_wadd_wch$NCURSES60", referenced from:
      Cloud::DrawMessage() const in cloud.o
      Droplet::Draw(std::__1::chrono::time_point>>, bool) in droplet.o
      Droplet::Draw(std::__1::chrono::time_point>>, bool) in droplet.o
  "_waddch$NCURSES60", referenced from:
      Droplet::Draw(std::__1::chrono::time_point>>, bool) in droplet.o
  "_wattr_off$NCURSES60", referenced from:
      Cloud::DrawMessage() const in cloud.o
      Droplet::Draw(std::__1::chrono::time_point>>, bool) in droplet.o
  "_wattr_on$NCURSES60", referenced from:
      Cloud::DrawMessage() const in cloud.o
      Droplet::Draw(std::__1::chrono::time_point>>, bool) in droplet.o
  "_wbkgd$NCURSES60", referenced from:
      Cloud::SetColor(Color) in cloud.o
  "_wgetch$NCURSES60", referenced from:
      HandleInput(Cloud*) in neo.o
  "_winnwstr$NCURSES60", referenced from:
      Cloud::Rain() in cloud.o
      Cloud::CalcMessage() in cloud.o
ld: symbol(s) not found for architecture arm64
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [neo] Error 1
make: *** [all-recursive] Error 1

@kr4t0z
Copy link

kr4t0z commented Jul 19, 2024

@realhackcraft @kr4t0z to double-check, you have downloaded a different ncurses implementation, say via Homebrew's brew install ncurses and ran all command with the following set up?

export LDFLAGS="-L/opt/homebrew/opt/ncurses/lib"
export CPPFLAGS="-I/opt/homebrew/opt/ncurses/include"

I've just placed this before ./configure; make; sudo make install in the same shell script and ran the whole thing together. Give it a try and let me know

Did that and just worked!!! Thanks guys, y'all are awesome

@realhackcraft
Copy link

Ok, it worked after I re cloned the repo. I think it was because the compiler puts the compiled binary into src and I didn't remove them.

@AlKhrulev
Copy link

Glad to heat it got resolved, it would be sad if no one could compile this anymore on (some?) Macs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants