- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 zlib 已经很多年了,从来没有想过它的命名有点不合常规。虽然 Linux 上的大多数库都遵循 lib<name>.so
的命名约定对于共享对象和lib<name>.a
对于文件,zlib 被命名为 zlib.so
/zlib.a
。我的问题是: gcc/ld 如何知道寻找 zlib.so
当我使用-lz
时作为链接标志?
据我所知,为了链接,gcc 调用 ld,它在某些默认路径和用 -L
指定的任何路径中搜索库。 ,并附加 lib
和.so
或.a.
必要时备件。奇怪的是,gcc's manual page for linking options只提到链接器可以找到文件;没有提及 .so
扩大。 man page for ld至少提到了两个扩展名,但仍然只提到通过前置 lib
进行搜索到指定的库名称。 ld怎么知道添加lib
在z
之后对于 zlib?我从未见过其他图书馆发生过这种情况。
最佳答案
gcc
有几种不同的方法来链接库,共享的或静态的。如果指定-lz
, gcc
将寻找libz.so
(可能在 libz
和 .so
之间有一些版本位,但重要的部分是文件名将以 libz
开头并以 .so
结尾),或 libz.a
(同样,可能包含版本信息)如果您正在静态编译,或者如果共享库不存在则作为后备。如果指定-lzlib
它将寻找 libzlib.so
(这不是标准名称 - 包通常被命名为 zlib
,但库本身是 libz
)。另一种链接方式是不使用 -l<lib>
选项,只需指定 /path/to/zlib.so
或-L /path/to zlib.so
(或者 zlib.a
如果你愿意的话)。在这种情况下,库不必具有 lib
前缀,但您必须显式提供任何版本信息,除非提供符号链接(symbolic link)或类似的内容来提供文字名称 zlib.so
.
应用程序还可以通过 dlopen()
在运行时加载共享库还有其他关联的函数,在这种情况下,库也可以命名为您想要的任何名称(当然,这不适用于静态库)。
所以,如果您正在查看的库实际上名为 zlib.so
,那么 gcc ... -lz
没有找到它,除非它恰好是指向 libz.so
的符号链接(symbolic link)(反之亦然,在这种情况下 gcc
实际上只是使用 libz.so
,它恰好与您的 zlib.so
具有相同的内容)。然而gcc
如果构建过程在链接阶段显式命名库(不使用 -l<lib>
)或者如果您的应用程序通过 dlopen()
加载它,则可能会使用它(但在这种情况下,它并没有真正链接到您的程序 - 它只是在运行时加载)。
关于gcc - gcc/ld 如何找到 zlib.so?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20051202/
我正在尝试创建尽可能小的 ELF。我创建了一个这样的测试文件(NASM 语法): SECTION .text dd 0xdeadbeef 使用此链接描述文件: SECTIONS { .text
GNU LD 链接器命令语言是否有条件语句? 背景:我正在为 arm cortex m0+ 开发固件,该固件由引导加载程序和应用程序组成。两者都在单独的项目中进行编译和刷新,但我使用了一个框架,其中包
我很确定 ld 有一个手册页链接器脚本语法,但我找不到它。 最佳答案 如果您更喜欢比 info 更方便的东西, 这是一个可浏览的 HTML 版本:ld.info: Scripts .但它可能不是完全最
谁能解决这个练习,这样我就能明白我错在哪里,因为有太多的 LOL 变量。 生成一个 C 代码,将其放在以下表达式之前 printf ("% ld% ld% ld \ n", lol, & lol, *
在他关于理解 Linux Kernel Initcall Mechanism 的文章中, Trevor 创建了一个用户空间程序来模拟调用 linux 驱动程序的 init_module() 的机制。
/usr/bin/ld: cannot find -ldlib /usr/bin/ld: cannot find -lcblas /usr/bin/ld: cannot find -llapack 在
我想以 json-ld 格式创建一组人,但我需要保留一些键而不是使用数组,所以我首先尝试了这个: { "@context" : { "@base" : "http://www.exampl
所以我试图围绕 JSON-LD 进行思考,我看到的所有示例主要包括嵌入“链接数据”。但我想提供对链接数据的引用(主要是因为嵌入所有数据可能会产生 10MB 的有效负载)。所以我想知道我这样做是否正确。
我在这里复制了 json-ld standard 中的示例的一部分: { "@context": { "foaf": "http://xmlns.com/foaf/0.1/", "
考虑这样一个程序: #include void foo() __attribute__((__weak__)); int main() { printf("%p\n", (void *)fo
我正在尝试使用一个名为 GLV 的小部件库对于我正在开发的应用程序。我正在运行 Linux Mint 17。我安装了所有库并成功构建了 GLV 库,但是当我尝试运行已构建的示例之一时,出现了此共享库错
在将未编辑的 JSON 数据转换为 JSON-LD 时,使用前缀和数据值为对象构造 IRI 时遇到问题。我运行的示例代码是: { "@context" : { "prefix" : "
假设我有一个 JSON 对象,它在嵌套对象中包含一些属性。 { "title": "My Blog Post", "meta": { "publishedAt": "2
我是 JSON-LD 和 LOD 的新手,所以请原谅我使用的术语。我正致力于在 JSON-LD 中创建数据模型,以描述基于欧洲数据模型 (http://pro.europeana.eu/edm-doc
我有一个玩具 x86 汇编程序,我正在用 as 编写和编译它和 ld : .text .global _start _start: movq $1, %rax movq
我正在尝试创建 Google 的结构化数据,但不知道我在做什么。我将其设置为一个组织,然后将 SD 标记工具用于我的所有产品。我将每个 JSON-LD 产品直接从标记工具而不是嵌套放入它自己的脚本标签
我正在尝试创建 Google 的结构化数据,但不知道我在做什么。我将其设置为一个组织,然后将 SD 标记工具用于我的所有产品。我将每个 JSON-LD 产品直接从标记工具而不是嵌套放入它自己的脚本标签
我正在尝试使用 vcpkg 和 ndk r20 为 android arm 构建 tesseract我必须编辑 CMakeLists.txt 并添加 glob.c 和 glob.h,因为它们不在 nd
长话短说: 有没有办法让我(没有 root 访问权限)使链接器(由 gcc 调用)不知道 /etc/ld.so.conf 中包含的目录的内容 在通过 ldconfig 缓存之后? 详细说明: 我正在尝
我想将/opt/vertica/lib64 添加到系统库路径中,所以我执行以下步骤: (1) 将/opt/vertica/lib64加入/etc/ld.so.conf,运行ldconfig, (2)
我是一名优秀的程序员,十分优秀!