我正在阅读GCC简介,它说如果一个软件包同时包含.a和.so.gcc更喜欢共享库.默认情况下,加载程序仅在预定义的一组系统目录(例如/usr/local/lib
和)中搜索共享库/usr/lib
.如果库不在其中一个目录中,则必须将其添加到加载路径,或者您需要使用-static
选项强制它使用.a库.但是,我尝试了以下方法:
vim hello.c:
#include <gmp.h>
#include <stdio.h>
int main() {
mpz_t x;
mpz_init(x);
return 0;
}
gcc hello.c -I/opt/include -L/opt/lib -lgmp (my gmp library is in opt)
./a.out
Run Code Online (Sandbox Code Playgroud)
它运行.该书说它应该有以下错误:
./a.out: error while loading shared libraries:
libgdbm.so.3: cannot open shared object file:
No such file or directory
Run Code Online (Sandbox Code Playgroud)
(好吧,这本书以GDBM为例,但我使用的是GMP,但这没关系吗?)
但是,我没有设置LD_LIBRARY_PATH=/opt/lib
,你可以看到我也没有使用-static
选项,但a.out
仍然运行.
你能告诉我为什么,并告诉我如何得到书中描述的错误?是的我想要错误,所以我会理解我误解的内容.
我有以下 html 代码:
<!DOCTYPE html>
<html>
<head>
<style>
:first-line {
color: red;
}
:first-child {
color: blue;
}
</style>
</head>
<body>
<p>asdasdasdsad<br>sdfsdfs</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
输出是:
asdasdasdasd <- 红色
sdfsdfs <- 蓝色。
但是,我在想的是 p 标签是 body 的第一个孩子。first-child 是一个伪类,其特殊性为 10,而 first-line 是一个伪元素,其特殊性为 1。因此,这两行都应该显示为蓝色文本,但我显然错了。
请指出我的错误。非常感谢。
我正在读一本关于海湾合作委员会的书.它表示,对于任何C程序,默认情况下只链接标准库.由于pow()
不在标准库中,我将不得不使用-lm
标志链接到它.但是,当我编译时,我只是使用:
gcc hello.c -o hello
Run Code Online (Sandbox Code Playgroud)
它仍然有效..
还有另外一个类似的问题,本书还说如果你有printf("%f\n", 4);
你的C程序,如果你编译WITHOUT -Wall
选项,将不会发出警告.但是,我尝试在没有-Wall
选项的情况下编译它,但我仍然收到警告:
hello.c:6:2:警告:格式'%f'需要类型为'double'的参数,但参数2的类型为'int'[-Wformat]
为什么是这样?这本书说我必须提供-lm
并-Wall
为了使我的程序编译并得到警告,但我没有使用它们中的任何一个,但我仍然编译我的程序并得到警告?
谢谢!