neo
neo copied to clipboard
MAC OSX install Instructions
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"
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
@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.
@realhackcraft I've compiled for M3 Max recently without any issues. Are you using clang or gcc?
@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
@realhackcraft I'm facing the same issue as you.
I'm on M2 Pro
@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
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.
Is there a way of enabling verbose mode on clang++ from the make file? I don't know which one to edit.
@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
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<:__1::chrono::steady_clock std::__1::chrono::duration long std::__1::ratio>>>, bool) in droplet.o
Droplet::Draw(std::__1::chrono::time_point<:__1::chrono::steady_clock std::__1::chrono::duration long std::__1::ratio>>>, bool) in droplet.o
"_waddch$NCURSES60", referenced from:
Droplet::Draw(std::__1::chrono::time_point<:__1::chrono::steady_clock std::__1::chrono::duration long std::__1::ratio>>>, bool) in droplet.o
"_wattr_off$NCURSES60", referenced from:
Cloud::DrawMessage() const in cloud.o
Droplet::Draw(std::__1::chrono::time_point<:__1::chrono::steady_clock std::__1::chrono::duration long std::__1::ratio>>>, bool) in droplet.o
"_wattr_on$NCURSES60", referenced from:
Cloud::DrawMessage() const in cloud.o
Droplet::Draw(std::__1::chrono::time_point<:__1::chrono::steady_clock std::__1::chrono::duration long std::__1::ratio>>>, 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
@realhackcraft @kr4t0z to double-check, you have downloaded a different
ncursesimplementation, say via Homebrew'sbrew install ncursesand 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 installin 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
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.
Glad to heat it got resolved, it would be sad if no one could compile this anymore on (some?) Macs.