未定义的引用 - 尽管链接器找到了 lib

2023-11-24

我有一个简单的程序来测试 python 开发文件的可用性:

#include<Python.h>
int main(){Py_Initialize(); Py_Finalize(); }

我将其编译(安装了 python 2.7)为gcc -I/usr/include/python2.7 -lpython2.7 p.c。它在其他机器上工作得很好,除了在 Ubuntu 12.04 的大部分干净的 chroot 上(精确)我不断得到

/tmp/ccj8Mgjb.o: In function `main':
p.c:(.text+0x5): undefined reference to `Py_Initialize'
p.c:(.text+0xa): undefined reference to `Py_Finalize'
collect2: ld returned 1 exit status

标头已安装,/usr/lib/libpython2.7.so存在,但链接器仍然失败。该符号列在.so文件,gcc 正在读取正确的内容libpython2.7.so:

$ nm -D libpython2.7.so.1.0  | grep Py_Initialize
00000000000c9c20 T Py_Initialize
00000000000c9260 T Py_InitializeEx

$ strace -f gcc -I/usr/include/python2.7 -lpython2.7 /tmp/p.c 2>&1 |grep   libpython2.7 |grep open
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libpython2.7.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libpython2.7.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libpython2.7.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libpython2.7.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libpython2.7.so", O_RDONLY) = 7

有任何想法吗?


Try:

gcc -I/usr/include/python2.7 p.c -lpython2.7 

链接器还不知道Py_Initialize加载时是必需的符号libpython2.7.a,所以它把它扔掉了。然后它到达 p.o,并对丢失的符号大发雷霆。以这种方式排序将使链接器在后续输入中查找丢失的符号。

See: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

在命令中编写此选项的位置会有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,foo.o -lz bar.o' searches libraryz' 在文件 foo.o 之后但在 bar.o 之前。如果 bar.o 引用“z”中的函数,则可能不会加载这些函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未定义的引用 - 尽管链接器找到了 lib 的相关文章

  • 对常量数组的未定义引用

    a cpp const unsigned char whatever 123 a h extern const unsigned char whatever 123 b cpp include a h unsigned char x wha
  • 使用 Turbo C 编译并链接到 .com 文件

    我正在尝试使用 Turbo C 编译器和链接器编译一个简单的程序并将其链接到 DOS com 文件 我尝试了我能想到的最简单的 C 程序 void main Turbo C 链接器中是否有链接到 com 文件的命令行参数 我从链接器收到的错
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 链接 .Net 程序集

    这都是假设 所以请耐心等待 假设我正在用 C 编写一个名为 Foo 的工具 输出是 foo exe 我发现了一些我喜欢使用的非常棒的库 称为 Bar 我可以在我的项目中将其引用为 bar dll 当我构建项目时 我的输出目录中有 foo e
  • OCUnit 无法识别导入的文件

    我正在我的 iPhone 应用程序上使用 XCode 3 2 3 和 iOS 4 0 上的 OCUnit 进行单元测试 我已成功设置测试环境以适当地通过和失败基本测试 但是当我导入自己的文件 在本例中为 UserAccount h 时 它无
  • 在共享库中不使用 PLT 的情况下调用另一个目标文件中的函数?

    我有两个汇编代码 code1 s and code2 s我想从这两个构建一个可重定位 使用 fPIC 开关 共享库 I want code2 s调用一个函数 名为myfun1 其定义在code1 s 当我使用call myfun1 PLT
  • 有什么工具可以了解 Windows 中正在运行的进程的布局(段)?

    我一直很好奇 该进程在内存中到底是什么样子的 其中有哪些不同的部分 部分 程序 在磁盘上 和进程 在内存中 到底是如何相关的 我之前的问题 有关可执行程序 进程 的内存布局的更多信息 https stackoverflow com ques
  • 具有重复符号的 C++ 插件库上的段错误

    我有一个跨平台 C 应用程序 它分为多个共享库 并从插件共享库加载附加功能 插件库应该是自包含的并自行运行 无需了解或依赖于调用应用程序 其中一个插件包含从主应用程序复制的代码 因此包含与引擎中的符号名称重复的符号名称 是的 我知道这通常是
  • 链接和名称修改如何工作?

    让我们看一下这个代码示例 header struct A struct B struct C extern C c code A myfunc B b A a return a void myfunc B b C c C c 让我们从代码部
  • Xcode:警告:找不到选项的目录[重复]

    这个问题在这里已经有答案了 Ld Users pwang Library Developer Xcode DerivedData socketiohldwxnslzhlnjtgihgewdwavpjpb Build Products Deb
  • 如何禁用导入库的生成?

    我正在 Visual Studio 中创建一个 COM DLL 链接器为 DLL 生成导入库 我不需要导入库 有什么办法告诉链接器不要生成它吗 九年后 这可能对 OP 没有用 但可能对其他寻求解决方案的人有用 LINK EXE 支持 NOI
  • 对符号“pthread_key_delete@@GLIBC_2.2.5”的未定义引用

    我正在尝试在 Ubuntu 中创建一个文件 当我创建时 我不断收到此错误 usr bin ld gtest 1 7 0 libgtest a gtest all cc o undefined reference to symbol pthr
  • C++中全局变量和静态成员变量动态初始化的实现

    我有一些关于执行C 中关于链接和可执行模块加载过程的变量初始化 我主要关心的是全局变量和静态成员变量的动态初始化 其中初始化过程涉及代码的执行 我正在寻找解决 Windows 和 Linux 问题的答案 我已经明白在静态初始化的情况下 编译
  • 通过 cmake 使用预编译的张量流

    我已经建立了一个 C 项目CLion使用CMake 我正在使用各种第三方库 并且还想集成张量流 我试过了bazel编译张量流到共享库libtensorflow so哪种工作有效 但是仍然有相当多的依赖项 例如当前的 protobuf 版本
  • 动态链接共享库中的全局变量和静态变量会发生什么情况?

    我试图了解当具有全局变量和静态变量的模块动态链接到应用程序时会发生什么 我所说的模块是指解决方案中的每个项目 我经常使用 Visual Studio 这些模块内置于 lib 或 dll 或 exe 本身中 据我所知 应用程序的二进制文件包含
  • 将 OpenBLAS 链接到 MinGW

    我正在尝试链接OpenBLAS https www openblas net 图书馆与明GW w64 https mingw w64 org Windows 上的编译器 这是我的代码 include
  • 链接器错误:头文件中对函数的未定义引用

    I did尝试找到我的具体问题 但我发现的最接近的是这个问题 https stackoverflow com questions 43143833 linker error when including header in files ot
  • 将模板化 C++ 类拆分为 .hpp/.cpp 文件——可能吗?

    我在尝试编译 C 模板类时遇到错误 该类分为 hpp and cpp file g c o main o main cpp g c o stack o stack cpp g o main main o stack o main o In
  • MSVC:手动使用 link.exe

    我正在尝试使用测试 C OpenGL SDL 项目设置名为 Waf 的构建系统 但在链接过程中遇到了一些问题 据我所知 所有库都已正确找到 并添加到链接命令中 但链接过程似乎就像库未链接一样 为了尝试调试该过程 我尝试手动运行编译 链接过程
  • 如何更改解释器路径并将命令行参数传递给 Linux 上的“可执行”共享库?

    这是 可执行 共享库的最小示例 假设文件名 mini c Interpreter path is different on some systems definitely different for 32 Bit machines cons

随机推荐