2013-10-09 63 views
0

我在Mac OS X中一个makefile,并为最终的编译最后一个命令行是:静态库

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

但它响应:

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

我发现,库libfl.a是在/ opt/local/lib目录/和修改命令行改为:

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

它完美的作品,但我读过的时候可以看到形式-l的先决条件,GNU使得搜索形式为libNAME.so的文件;如果找不到匹配项,则搜索libNAME.a。这里make应该找到/opt/local/lib/libfl.a并且继续最后一个动作,链接,但是这不会发生。

我尝试使用LD_LIBRARY_PATH,然后意识到,因为我在Mac上工作,我必须使用DYLD_LIBRARY_PATH,我导出指向/ opt/local/lib的变量,并尝试再次运行makefile,无法正常工作。发现另一个名为DYLD_FALLBACK_LIBRARY_PATH的环境变量,导出,没有工作。

我该怎么办?

回答

0

make根本不搜索该库。 make只是调用其他工具。 (ld,由gcc调用)所有您需要做的是从make将适当的标志传递给gcc。也许,这只是意味着增加

LDFLAGS=-L/opt/local/lib 

到你的Makefile(或者直接编辑命令,因为它似乎你已经在测试过程中完成),但很难说没有看到Makefile文件。

4

DYLD_LIBRARY_PATH(和LD_LIBRARY_PATH其他Unix系统)提供了搜索路径的装载机,在运行时解决链接库。 LIBRARY_PATH是提供编译器将在链接时传递给链接器的路径的相关变量。

但是,OS X的链接器ld64没有办法在两种库存在的情况下选择静态链接而不是动态链接,这意味着您的唯一选择是将完整路径传递到存档。

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

这是真的那么-l做它搜索路径和扩展的lib名之后。