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 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 的环境变量,已导出,但不起作用。

我应该怎么办?

4

3 回答 3

4

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

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

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

这就是-l它搜索路径并扩展库名称后所做的一切。

于 2013-10-10T00:16:58.827 回答
0

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

于 2014-10-15T17:27:00.197 回答
0

make根本不搜索图书馆。 make只是调用执行此操作的其他工具。( ld, 由 调用gcc) 您需要做的就是将正确的标志传递给gccfrom make。可能,这只是意味着添加

LDFLAGS=-L/opt/local/lib

到您的 Makefile(或直接编辑命令,就像您在测试期间所做的那样),但是如果没有看到 Makefile 就很难分辨。

于 2013-10-09T23:43:28.957 回答