当前位置: 首页 > 面试题库 >

即使使用math.h和库链接-lm也“未定义对'pow'的引用”

南门棋
2023-03-14
问题内容

我正在使用math.h-lm编译选项。我已经尝试了所有:

gcc -o ssf ssf_tb.c ssf.c -lm
gcc -o ssf ssf_tb.c -lm ssf.c   
gcc -o -lm ssf -lm ssf_tb.c ssf.c

但是错误:

undefined reference to 'pow'

在所有情况下都会发生。


问题答案:

将放在-lm行尾。

gcc按照在命令行上出现的顺序处理为最终程序指定输入的参数。该-lm参数被传递给链接器和ssf.c参数,例如,被编译,并且将所得的目标文件被传递给链接器。

链接器还按顺序处理输入。当看到-lm指定的库时,它会查看该库是否提供 了链接器当前需要的
任何符号。如果是这样,它将从库中复制带有这些符号的模块,并将其构建到程序中。当链接器看到一个对象模块时,它将该对象模块构建到程序中。将对象模块引入程序后,链接器不会返回并查看它是否需要早期库中的任何内容。

因为您首先列出了库,所以链接器看不到库中需要的任何内容。如果首先列出目标模块,则链接器会将目标模块带入程序。在此过程中,链接器将列出对象需要的所有未定义符号的列表。然后,当链接程序看到该库时,它将看到该库提供了这些符号的定义,并将带有这些符号的模块带入程序。



 类似资料:
  • 问题内容: 这有什么问题吗?我有以下简单的课程: 在运行一个简单的compile()之后,出现以下错误: 在共享库上运行nm表示实际上已找到它: 这是在Ubuntu 12.04上发生的。该 libmnl-dev的 和 libmnl0 包安装。的输出表明正使用该* .so文件: 问题答案: 库必须在使用它们的对象之后列出(更确切地说,仅当库包含满足遇到未定义引用的符号时,才使用库)。将移至命令末尾。

  • 问题内容: 我只是在创建一个用于检查对象数组中某个值的函数,但是由于某种原因,它一直在返回。这是为什么? 问题答案: 在函数中,您是从传递给的函数返回的,而不是从返回的。 您可以这样修改它: 但这会迭代所有元素,即使立即找到该项目也是如此。这就是为什么最好使用一个简单的循环: 请注意,我还修改了您的代码以返回值,而不是键。我想这就是意图。您可能还对另一个迭代函数感到困惑:传递给forEach的回调

  • 我正在尝试使用mySQL c连接器。我已经按照mysql指南https://dev . MySQL . com/doc/connector-CPP/8.0/en/connector-CPP-installation-binary . html下载并解压了二进制文件 当我包括 xdevapi 像这样 我得到以下错误 /tmp/cc6dzD4k.o:在函数` mysqlx::string::opera

  • 问题内容: 我可以毫无问题地创建一个共享库。我创建了libcbitcoin.so(没有错误),并尝试通过可执行文件以及OpenSSL库与之链接。我使用以下命令: bin目录是库的位置。obj目录包含我希望链接到可执行文件的目标文件。在命令中,我使用-L,-l和- rpath选项,我认为这是在Linux中进行链接所需的全部。由于出现类似以下的错误,看来我错了: 在库中找到CBNewByteArray

  • 可能重复: 什么是未定义的引用/未解决的外部符号错误,如何修复? 试图通过 我得到一个错误: main.cpp 搞砸h文件: 有什么想法吗?使用此函数构建具有设置大小的哈希表。 编辑:散列。cpp文件 正在尝试通过以下终端进行编译: g-c Hash.cpp-o Hash. o g-omain.cpphash. o-std=c 0x 不知怎的,它进入了一个无限循环。

  • 我正在尝试使用AassetManager从android apk访问资产。然而,尽管我已经包含了asset_manager.h和asset_manager_jni.h,但我仍然得到了“对aassetmanager_fromjava的未定义引用”。其他来自asset_manager.h的函数,如AAssetManager_openDir(mgr,"“)等也不能被引用。 以下是完整的代码 这段代码在一