【问题标题】:Find the "name" of a library (-L -l switches)查找库的“名称”(-L -l 开关)
【发布时间】:2010-05-26 17:04:04
【问题描述】:

对 C++ 相当陌生,我有一个关于 g++ 编译器的问题,尤其是库的包含。考虑以下生成文件:

CPPFLAGS= -I libraries/boost_1_43_0-bin/include/ -I libraries/jpeg-8b-bin/include/
LDLIBS= libraries/jpeg-8b-bin/lib/libjpeg.a
# LDLIBS= -L libraries/jpeg-8b-bin/lib -llibjpeg

all: main

main: main.o
    c++ -o main main.o $(LDLIBS)

main.o: main.cpp
    c++ $(CPPFLAGS) -c main.cpp

clean:
    rm -rf *.o main

如您所见,我两次声明了 LDLIBS 变量。如果我使用上面的 makefile,我的代码正在编译和工作。但是,如果我停用第一个 LDLIBS 条目并激活第二个条目,我会得到ld: library not found for -llibjpeg。我假设我的libjpeg.a 不叫libjpeg,但有一些不同的名字。

有没有办法找出给定“库文件”libsomething.alibsomething.dyn 的名称?


好的,感谢您的所有回答,它现在正在工作。 还有一个小问题:简单地省略“lib”是一种惯例,还是有一种标准化的方法来找出名称?

【问题讨论】:

    标签: c++ compiler-construction g++ command-line-arguments


    【解决方案1】:

    如果您使用-l 开关,则不需要lib 部分。

    LDLIBS=-Llibraries/jpeg-8b-bin/lib -ljpeg
    #                                    ^^^^
    

    每当您编写-lxxx 时,链接器都会在所有提供的库路径中查找文件名为libxxx.<ext> 的库。这是ld 的标准约定,对于大多数基于 UNIX 的链接器来说应该是正确的。

    【讨论】:

      【解决方案2】:

      通常,如果您使用第二种形式的 LDLIBS 声明,您应该删除 -llibjpeg 中的字母 lib 以获取 -ljpeg。

      【讨论】:

        【解决方案3】:

        -I或-L与后面的路径之间没有空格,-lxxx表示lib,所以

        -Llibraries/jpeg-8b-bin/lib -ljpeg
        

        应该可以解决问题。

        【讨论】:

          猜你喜欢
          • 2013-12-03
          • 2012-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-22
          • 1970-01-01
          • 2021-09-21
          相关资源
          最近更新 更多