我在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的环境变量,导出后无法正常工作。
我该怎么办?
答案 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
调用)您需要做的就是从gcc
向make
传递正确的标记。可能,这只是意味着添加
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