natorro
natorro

Reputation: 3153

Static libraries in Mac OS X

I have a makefile in Mac OS X and the last command line for the final compilation is:

gcc  count_words.o lexer.o -lfl -o count_words

but it responds:

ld: library not found for -lfl
collect2: ld returned 1 exit status

I found that the library libfl.a is in /opt/local/lib/ and that modifying the command line to read:

gcc count_words.o lexer.o -L/opt/local/lib/ -lfl -o count_words

it works perfectly, but I've read when a prerequisite of the form -l is seen, GNU make searches for a file of the form libNAME.so; if no match is found, it then searches for libNAME.a. Here make should find /opt/local/lib/libfl.a and proceed with the final action, linking, but this is not happening.

I tried using LD_LIBRARY_PATH, then realized that as I'm working on Mac I have to use DYLD_LIBRARY_PATH, I exported the variable pointing to /opt/local/lib and tried running the makefile again, didn't work. Found another environment variable called DYLD_FALLBACK_LIBRARY_PATH, exported, didn't work.

What should I do?

Upvotes: 0

Views: 6984

Answers (3)

xji
xji

Reputation: 8277

Probably this question Library not found for -lfl is relevant. For some reason if you try -ll instead of -lfl it works on OS X. Also see http://linux-digest.blogspot.hk/2013/01/using-flex-on-os-x.html

Upvotes: 0

tab
tab

Reputation: 903

DYLD_LIBRARY_PATH (and LD_LIBRARY_PATH on other unices) provides search paths for the loader, to resolve linked libraries at runtime. LIBRARY_PATH is the relevant var for providing paths that the compiler will pass to the linker at link time.

However, OS X's linker ld64 has no way to prefer static linking over dynamic in the presence of both kinds of libraries, which means your only option is to pass the full path to the archive anyway.

gcc count_words.o lexer.o /opt/local/lib/libfl.a -o count_words

Which is really all that -l does after it searches the paths and expands the lib name.

Upvotes: 4

William Pursell
William Pursell

Reputation: 212544

make does not search for the library at all. make just invokes other tools that do that. (ld, which is invoked by gcc) All you need to do is pass the proper flags to gcc from make. Possibly, this just means adding

LDFLAGS=-L/opt/local/lib

to your Makefile (or editing the command directly, as it appears you have done during testing), but it is difficult to tell without seeing the Makefile.

Upvotes: 0

Related Questions