Mac OS X中的静态库

时间:2013-10-09 23:26:38

标签: c macos gcc makefile

我在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 make会搜索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的环境变量,导出后无法正常工作。

我该怎么办?

3 个答案:

答案 0 :(得分:4)

DYLD_LIBRARY_PATH(以及其他unices上的LD_LIBRARY_PATH)为加载程序提供搜索路径,以便在运行时解析链接库。 LIBRARY_PATH是用于提供编译器在链接时传递给链接器的路径的相关var。

但是,OS X的链接器ld64无法在存在两种库的情况下优先选择动态静态链接,这意味着您唯一的选择就是将完整路径传递给存档。

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

-l在搜索路径并扩展lib名称之后真正做到了这一切。

答案 1 :(得分:0)

make根本不会搜索该库。 make只是调用其他工具。 (ld,由gcc调用)您需要做的就是从gccmake传递正确的标记。可能,这只是意味着添加

LDFLAGS=-L/opt/local/lib

到你的Makefile(或直接编辑命令,因为你在测试过程中看到它),但是如果没有看到Makefile就很难判断。

答案 2 :(得分:0)

可能这个问题Library not found for -lfl是相关的。出于某种原因,如果您尝试使用-ll而不是-lfl,它可以在OS X上运行。另请参阅http://linux-digest.blogspot.hk/2013/01/using-flex-on-os-x.html