【问题标题】:linker can't find libraries链接器找不到库
【发布时间】:2015-11-01 18:59:30
【问题描述】:

我无法将我的程序“set-manipulation”与它需要的库链接起来。

这是消息:

gcc -L/home/jenia/learn-c-the-hard-way/lib -lset_theory -g -Wall -I/home/jenia/learn-c-the-hard-way/lib/include -o "set-manipulation" main.o
/usr/bin/ld: cannot find -lset_theory
collect2: error: ld returned 1 exit status
Makefile:9: recipe for target 'set-manipulation' failed
make: *** [set-manipulation] Error 1

这里是-L/home/jenia/learn-c-the-hard-way/lib的内容:

  /home/jenia/learn-c-the-hard-way/lib:
  total used in directory 29 available 216513716
  drwxr-xr-x  3 jenia jenia 4096 Nov  1 12:47 .
  drwxr-xr-x  8 jenia jenia 4096 Oct 31 11:44 ..
  drwxr-xr-x  2 jenia jenia 4096 Nov  1 12:47 include
  -rwxr-xr-x  1 jenia jenia 6804 Nov  1 12:47 set_theory.a -- 50
  -rwxr-xr-x  1 jenia jenia 9664 Nov  1 12:47 set_theory.so -- 11

这是给出错误的makefile(set-manipulation程序的makefile):

PREFIX?=/home/jenia/learn-c-the-hard-way
CFLAGS=-g -Wall -I${PREFIX}/lib/include
LDFLAGS=-L${PREFIX}/lib
INSTALL_DIR=${PREFIX}/apps

all: set-manipulation

set-manipulation: main.o
    gcc $(LDFLAGS) -lset_theory $(CFLAGS) -o "$@" main.o


install: all
    install -d $(INSTALL_DIR)/set-manipulation
    install set-manipulation $(INSTALL_DIR)/set-manipulation

clean:
    rm -f *.o
    rm -f set-manipulation
    rm -rf *.dSYM

有人可以告诉我如何将我的程序与它的库链接吗?

【问题讨论】:

标签: c gcc makefile linker


【解决方案1】:
-L../../PATCH_to_library.a/set_theory.a

库必须命名为 libname.a/.so

例如:g++ Set.cpp -L../../libset_theory.a -lset_theory

如果您没有命名库 libname.a,则不会链接该库。

libtest.a

正确的链接语法:

g++ (LINK) -ltest

你看到了吗? -l 测试不包括库。 l - 库

g++ -g -Wall -L/lib_dir/xx Foo.o Test.o -lset_theory -o test

库的名称必须是libset_theory.a

【讨论】:

  • 好的,谢谢。我做了这个改变:` gcc $(LDFLAGS)/set_theory.a -lset_theory $(CFLAGS) -o "$@" main.o`。错误发生了变化。我更改了问题以反映您的建议。非常感谢!!
  • gcc -L/home/jenia/learn-c-the-hard-way/lib/ -lset_theory -g -Wall -I/home/jenia/learn-c-the-hard-way /lib/include -o "set-manipulation" main.o
  • 路径不需要设置 -L set_theory.a ,将 set_theory 重命名为 libset_theory.a
  • 再次感谢伙计。相同的消息思想。我对问题进行了更改以反映此更改。
  • 再次检查我的评论,已编辑。现在我更清楚了。
【解决方案2】:

-l 参数要求指定库的文件名采用特定格式。即,-lset_theory 告诉链接器查找名为libset_theory.a(或libset_theory.so)的文件。

请注意,您的库没有此前缀,因此您要么必须重命名它们,要么使用分号并指定文件名:

gcc -L/home/jenia/learn-c-the-hard-way/lib -l:set_theory.a ...

【讨论】:

  • 非常感谢。我喜欢使用冒号来指定库名称的选项。非常感谢。我希望 SO 可以选择多个答案作为好答案!!!
【解决方案3】:

我在这里可能错了,但您似乎没有包括库。我的意思是,您包含路径,而不是您想要使用的库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多