gcc/g++ 中 `-l`(小写“L”)标志的含义

问题描述 投票:0回答:1

传递给 gcc/g++ 的

-l
(小写“L”)标志是什么意思?我在哪里可以找到有关它的文档或教程?


我试过在

man gcc
man ld
中搜索
-l
,但那有数千个匹配项。

-l
标志的示例:

在此:

gcc -Wall -Wextra -Werror -O3 -std=c17 hello_world_extra_basic.c -o bin/a -lm && bin/a

-lm
说要包含数学库(静态 .a 或动态 .so?——我不知道)这样你就可以使用像
sin()
来自
math.h
的函数。

参见:

  1. https://en.cppreference.com/w/c/numeric/math
  2. https://stackoverflow.com/a/12165016/4561887

但我需要比这更详细的信息。专家请深入,有条理,简单。

  1. 调用

    -lgtest
    -lm
    的真正作用是什么?
    我可以清楚地手动传递
    -I
    包含目录,以及
    .a
    静态预构建文件,例如,就像我在这里的回答中这样

    # to manually build "googletest/googletest/samples/sample1_unittest.cc"
    time ( \
        time g++ -Wall -Wextra -Werror -O3 -std=c++17 -pthread \
        -I"googletest/googletest/include" -I"googletest/googlemock/include" \
        googletest/googletest/samples/sample1_unittest.cc \
        googletest/googletest/samples/sample1.cc \
        bin/libgtest.a bin/libgtest_main.a \
        -o bin/a \
        && time bin/a \
    )
    

    -lgtest
    是做什么的,必须在适当的位置才能使它起作用?

  2. 为什么

    -l
    ?那是名称中必须出现的部分吗? “l”的意思是“l'inker”吗?这些标志是转到编译器还是链接器?

  3. 为什么

    -lpthread
    -pthread
    ?我以前都见过,但不明白其中的区别。

  4. -l
    是否包括链接到静态
    .a
    库或运行时
    .so
    库?这些库在您的文件系统中的什么位置?

  5. 这与我在这里看到的

    sudo ldconfig -v
    的输出有什么关系

  6. 你能添加自己的

    -l
    标志吗?怎么样?

更新:搜索

ld --help
显示了这一点,所以
l
必须代表'l'library,但它是静态的还是动态的?:

-l LIBNAME, --library LIBNAME  
                            Search for library LIBNAME
gcc g++ ld
1个回答
0
投票

我已经弄清楚了,可以放心地发布答案。当我在这里写my answer.

时,我通过大量的试验和错误找出了几乎所有以下内容

有关完整详细信息,请参阅我的答案末尾的“进一步”部分:如何在 Linux 上将 googleTest 设置为共享库:“进一步:有关库的一般信息;调试;gcc/g++ 编译器标志;等等。”

以下是一些要点:

  1. 正如我在问题底部发现的那样,

    -l
    大概是指“图书馆”。这些标志显然直接通过
    gcc
    /
    g++
    传递到
    ld
    链接器。见
    ld --help
    。标志
    -lmylibraryname
    告诉链接器查找名为
    libmylibraryname.a
    的文件(如果是静态库),或者如果是 .so 共享对象动态库则以
    lib
    为前缀的类似名称。如果找到这样的库,一般在
    /usr/lib
    (通常是系统库),或者
    /usr/local/lib
    (通常是用户安装的库),则链接成功。

  2. 头文件也在

    /usr/include
    /usr/local/include
    中自动搜索。

  3. 根据上面的命名,

    -lm
    表示必须有一个名为
    libm.a
    的文件,例如,可能在
    /usr/lib
    某处。果然
    find /usr/lib -path "*libm.*"
    发现如下:

    $ find /usr/lib -path "*libm.*"
    /usr/lib/x86_64-linux-gnu/libm.so
    /usr/lib/x86_64-linux-gnu/libm.a
    /usr/lib/x86_64-linux-gnu/libm.so.6
    /usr/lib/i386-linux-gnu/libm.so.6
    
  4. -lgtest
    之所以有效,是因为
    libgtest.a
    处存在一个名为
    /usr/local/lib/libgtest.a
    的文件(遵循上述相同的命名规则),现在我已经按照上面链接中的自己的说明进行操作。

  5. 关于

    -lpthread
    vs
    -pthread
    ,以下是我在上面的回答中自己的笔记:

    1. 谷歌搜索

      g++ "-lpthread" vs "-pthread"
      揭示了这个答案:Difference between
      -pthread
      and
      -lpthread
      while compiling
      ,这表明
      -lpthread
      -pthread
      之间的差异是历史性的,所以今天的gcc / g++ 和 clang 编译器,you should always just use
      -pthread
      to bring in POSIX threads.

      -lpthread
      库现在显然是一个空的二进制文件,除了满足古老的要求外什么都不做,在某些地方仍然必须包含该库。但是,
      -pthread
      会为您处理所有这些,所以只需单独使用
      -pthread
      就可以了!

  6. -l
    是否包括链接到静态
    .a
    库或运行时
    .so
    库?这些库在您的文件系统中的什么位置?

    答案:要么。

    它们通常在

    /usr/lib
    (系统安装的库)或
    /usr/local/lib
    (用户安装的库)中,并且它们的文件名必须
    lib
    开头。

  7. sudo ldconfig -v
    仅显示动态库,它们已加载并可用于运行时链接(我认为)。

  8. 你可以添加自己的

    -l
    标志吗?怎么样?

    是的!首先,使用

    gcc
    g++
    将.c/.cpp 文件构建成.o 文件,然后使用
    ar
    将输出的.o 文件转换为归档.a 静态库文件。然后,通过
    /usr/local/lib
    或类似方式将您的 .a 文件复制到
    sudo cp -i -t /usr/local/lib lib/libgtest.a lib/libgtest_main.a lib/libgmock.a lib/libgmock_main.a
    中。有关手动构建 .o 和 .a 文件的完整详细信息,请在此处查看我的回答:How do I build and use googletest (gtest) and googlemock (gmock) with gcc/g++ or clang?.

我认为这涵盖了它。

© www.soinside.com 2019 - 2024. All rights reserved.