传递给 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
的函数。
参见:
但我需要比这更详细的信息。专家请深入,有条理,简单。
调用
-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
是做什么的,必须在适当的位置才能使它起作用?
为什么
-l
?那是名称中必须出现的部分吗? “l”的意思是“l'inker”吗?这些标志是转到编译器还是链接器?
为什么
-lpthread
与-pthread
?我以前都见过,但不明白其中的区别。
-l
是否包括链接到静态.a
库或运行时.so
库?这些库在您的文件系统中的什么位置?
这与我在这里看到的
sudo ldconfig -v
的输出有什么关系?
你能添加自己的
-l
标志吗?怎么样?
更新:搜索
ld --help
显示了这一点,所以l
必须代表'l'library,但它是静态的还是动态的?:
-l LIBNAME, --library LIBNAME Search for library LIBNAME
我已经弄清楚了,可以放心地发布答案。当我在这里写my answer.
时,我通过大量的试验和错误找出了几乎所有以下内容有关完整详细信息,请参阅我的答案末尾的“进一步”部分:如何在 Linux 上将 googleTest 设置为共享库:“进一步:有关库的一般信息;调试;gcc/g++ 编译器标志;等等。”
以下是一些要点:
正如我在问题底部发现的那样,
-l
大概是指“图书馆”。这些标志显然直接通过 gcc
/g++
传递到 ld
链接器。见ld --help
。标志 -lmylibraryname
告诉链接器查找名为 libmylibraryname.a
的文件(如果是静态库),或者如果是 .so 共享对象动态库则以 lib
为前缀的类似名称。如果找到这样的库,一般在/usr/lib
(通常是系统库),或者/usr/local/lib
(通常是用户安装的库),则链接成功。
头文件也在
/usr/include
和/usr/local/include
中自动搜索。
根据上面的命名,
-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
-lgtest
之所以有效,是因为 libgtest.a
处存在一个名为 /usr/local/lib/libgtest.a
的文件(遵循上述相同的命名规则),现在我已经按照上面链接中的自己的说明进行操作。
关于
-lpthread
vs -pthread
,以下是我在上面的回答中自己的笔记:
揭示了这个答案:Difference betweeng++ "-lpthread" vs "-pthread"
and-pthread
while compiling,这表明-lpthread
和-lpthread
之间的差异是历史性的,所以今天的gcc / g++ 和 clang 编译器,you should always just use-pthread
to bring in POSIX threads.-pthread
库现在显然是一个空的二进制文件,除了满足古老的要求外什么都不做,在某些地方仍然必须包含该库。但是,-lpthread
会为您处理所有这些,所以只需单独使用-pthread
就可以了!-pthread
是否包括链接到静态-l
库或运行时.a
库?这些库在您的文件系统中的什么位置?.so
答案:要么。
它们通常在
/usr/lib
(系统安装的库)或/usr/local/lib
(用户安装的库)中,并且它们的文件名必须以lib
开头。
sudo ldconfig -v
仅显示动态库,它们已加载并可用于运行时链接(我认为)。
你可以添加自己的
标志吗?怎么样?-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?.
我认为这涵盖了它。