ld(链接器或加载器)程序将目标文件,归档文件和(参考)共享库组合在一起,将其数据和地址与符号引用一起重定位。链接通常是编译程序的最后一步。
在 Debian 12 上使用 GNU ld 链接 libvulkan(未定义参考)的问题
我想用Vulkan学习编程。我的第一步是枚举系统上可用的 Vulkan 扩展数量。所以我写了这个简单的代码: #包括 #包括 我想用 Vulkan 学习编程。我的第一步是枚举系统上可用的 Vulkan 扩展数量。所以我写了这个简单的代码: #include <iostream> #include <vulkan/vulkan.hpp> int main(int argc, char *argv[]) { VkResult ret; unsigned int propertyCount; ret = vkEnumerateInstanceExtensionProperties(NULL, &propertyCount, NULL); if (ret != VK_SUCCESS) return 1; std::cout << "Vulkan: Extension Count: " << propertyCount << std::endl; return 0; } 当我尝试编译和链接代码时,出现 undefined reference 错误: $ g++ -lvulkan -o vkExtension vkExtension.cpp /usr/bin/ld: /tmp/user/1000/ccgB9M9N.o: in function `main': vkExtension.cpp:(.text+0xc99): undefined reference to `vkEnumerateInstanceExtensionProperties' collect2: error: ld returned 1 exit status $ 虽然 libvulkan 安装在我的系统上(Debian 12): $ cd /usr/lib/x86_64-linux-gnu $ ls -la | grep libvulkan -rw-r--r-- 1 root root 8575696 Mar 22 2023 libvulkan_intel_hasvk.so -rw-r--r-- 1 root root 11115728 Mar 22 2023 libvulkan_intel.so -rw-r--r-- 1 root root 6918024 Mar 22 2023 libvulkan_lvp.so -rw-r--r-- 1 root root 8711344 Mar 22 2023 libvulkan_radeon.so lrwxrwxrwx 1 root root 14 Feb 6 2023 libvulkan.so -> libvulkan.so.1 lrwxrwxrwx 1 root root 20 Feb 6 2023 libvulkan.so.1 -> libvulkan.so.1.3.239 -rw-r--r-- 1 root root 457224 Feb 6 2023 libvulkan.so.1.3.239 $ 我也检查了库本身是否缺少功能(符号),但应该在已安装的库中可用。命令 nm 不会列出任何符号,因为库已被删除。所以我用了readelf: $ readelf -s --wide libvulkan.so.1.3.239 | grep vkEnumerateInstance 136: 0000000000034850 687 FUNC GLOBAL DEFAULT 12 vkEnumerateInstanceExtensionProperties 170: 0000000000034b00 639 FUNC GLOBAL DEFAULT 12 vkEnumerateInstanceLayerProperties 283: 0000000000034d80 709 FUNC GLOBAL DEFAULT 12 vkEnumerateInstanceVersion $ 我还检查了链接器(GNU ld)的默认库搜索路径,但路径是正确的。 缺少什么? (SO上也有类似的问题。但不幸的是没有答案。) 更新 似乎问题与GNU GCC/ld相关。尝试使用 clang++/LLVM 构建代码,成功了: $ clang++ -Wall -Wextra -lvulkan -o vkExtension vkExtension.cpp vkExtension.cpp:5:14: warning: unused parameter 'argc' [-Wunused-parameter] int main(int argc, char *argv[]) ^ vkExtension.cpp:5:26: warning: unused parameter 'argv' [-Wunused-parameter] int main(int argc, char *argv[]) ^ 2 warnings generated. $ ./vkExtension Vulkan: Extension Count: 20 $ 也更新了问题标题。 我已经解决了这个问题。这是我的第 8 层(使用)问题。 链接参数的库必须在带有GCC/G++的源之后,当然,不能在之前: $ g++ -o vkExtension vkExtension.cpp -lvulkan 完全忘记了GCC/G++的这种行为。抱歉,其他 SO 用户浪费了您的时间。
TL;DR - 我需要用 test.o 编译 archive.a 以生成可执行文件。 背景 - 我试图从我正在修改的软件包中调用一个单独的库中的函数,但该函数(...
我正在尝试编译 zimg 作为 Debian 11 上其他一些软件的先决条件。由于所需的最低版本比 apt 提供的最新版本更新,我别无选择,只能编译...
当我尝试与 LD 链接时,Windows 版 MinGW 无法工作
我现在正在用 C 语言开发一个测试操作系统...并且我一直在查看 http://www.osdever.net/tutorials/view/brans-kernel-development-tutorial 来开始。我获得了 Windows 7(64 位)的 MinGW。我看...
GCC:- 在 Linux 上链接库以创建 so 文件时无法找到 libpthread_nonshared.a 文件
嗨,我正在尝试在 Ubuntu 20.04 中使用 gcc 10.2 编译一个 c 项目。 但最后它给了我如下错误 /usr/bin/ld: 找不到 /usr/lib/x86_64-linux-gnu/libpthread_nonshared.a 收集2:错误...
我正在使用PocketDOS来模拟ELKS,但我想使用gcc和ld对其进行开发,我该怎么做?
我有一个应用程序,我想使用 Linux 提供的 rtld-audit 接口来挂钩共享库加载过程。如果我使用 LD_AUDIT 环境变量来电话,这会非常有用...
我想知道为什么 g++ test1.o test2.o -o test.x -lgtk-x11-2.0 有效,同时 ld'r test1.o test2.o -o test.o -lgtk-x11-2.0 给出: ld:找不到-lgtk-x11-2.0 除非我明确包括...
为什么 .data.rel.ro 部分在我的可执行文件中占用如此多的空间?
我想在Linux上构建一个共享库,其中包含一个大的初始化数组,并在不同的可执行文件中使用该数组。 我希望这可以减少编译输出的大小,特别是......
如何找出在 Ubuntu 22.04 上使用 GCC 11 构建时 gcc 无法链接我的库(仅使用 lib 构造函数)的原因? 我在这里设置了一个小例子来尝试复制问题:https://
为什么 GNU `ld` 使用等效源与 NASM 和 GAS `.o` 文件有不同的输出?
在受许多关于小型 ELF 可执行文件的有趣文章启发进行一些实验时,我注意到 GNU 的 ld 在输入 nasm 生成的 .o 目标文件或 w...
crtbegin.o、crtbeginT.o 和 crtbeginS.o 有什么区别?
我正在尝试使用 ld 直接链接来隔离构建问题。 当我包含 /usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.so 时,我遇到了一些问题: ac-aaa.o:在函数`
通常,用户程序二进制文件将加载到程序地址空间的低地址(通常在 0x400000 左右),该地址空间将在 elf 二进制文件中指定(在 Linux 的情况下)。 我们可以...
我制作了一个 nasm 程序集 hello world 程序,如下所示: 全局启动 节.文本 开始: 莫夫拉克斯,0x20000004 莫夫RDI,1 lea rsi,[相关消息] mov rdx, msg.len 系统调用 我...
我有一个目标文件,其中有一堆我不关心的编译器生成的部分。当我使用链接器脚本将平面二进制文件链接在一起时,我有时可以看到这些部分放置在...
使用 sqlcipher 时如何强制 rustqlite 构建为静态链接?
我正在使用 rustqlite,并尝试将其配置为通过 Cargo 功能使用 sqlcipher。在通常情况下,rustqlite 有一个捆绑功能来包含 sqlite 源。当更改为 sqlcipher 时,...
在 FIWARE NGSI-LD 中设计和注册命令以从 URL 下载数据
我正在与 FIWARE 合作,特别是与 NGSI-LD 合作。我的目标是创建一个执行器,我可以向其发送命令以从 URL 下载信息。 为了实现这一目标,我想设计...
在 IoT 代理中创建执行器设备时出错 (FIWARE | NGSI-LD)
正如标题中提到的,我正在与 FIWARE 合作,特别是与 NGSI-LD 合作。为此,我使用 Docker Compose 部署了一系列容器:ld-context(这是要提供的容器
在 Windows 中构建 NIfTI C 库:未定义的引用?
我正在使用 MinGW gcc 14.2.0 和 CMake 3.30.3 在 Windows 上构建 NIfTI C 库。我注意到两件事: 1:我之前使用相同的构建工具编译了 Z 库 libz.dll.a,并且
将两个 GCC 编译的 .o 目标文件合并到第三个 .o 文件中
如何将两个 GCC 编译的 .o 目标文件合并到第三个 .o 文件中? $ gcc -c a.c -o a.o $ gcc -c b.c -o b.o $ ??? a.o b.o -o co.o $ gcc c.o other.o -o 可执行文件 如果您有权访问