使用 ICC 在 Linux 中未定义的对 clock_gettime() 的引用

Posted

技术标签:

【中文标题】使用 ICC 在 Linux 中未定义的对 clock_gettime() 的引用【英文标题】:Undefined reference to clock_gettime() in Linux using ICC 【发布时间】:2013-06-15 23:10:54 【问题描述】:

我正在尝试让代码(见下文)在 Ubuntu 上运行。代码使用clock_gettime()。我想我已经成功链接到 librt.a:

**** Build of configuration Debug for project test ****

make -k all 
Building file: ../src/test.cpp
Invoking: Intel Intel(R) 64 C++ Compiler 
icpc -g -I/usr/include/boost -std=c++0x -MMD -MP -MF"src/test.d" -MT"src/test.d" -c -o "src/test.o" "../src/test.cpp"
Finished building: ../src/test.cpp

Building target: test
Invoking: Intel Intel(R) 64 C++ Linker
icpc  -l  /usr/lib/x86_64-linux-gnu/librt.a  -o "test"  ./src/test.o   
icpc: command line warning #10155: ignoring option '-l'; argument required
./src/test.o: In function `main':
/home/p/workspace/test/Debug/../src/test.cpp:12: undefined reference to `clock_gettime'
/home/p/workspace/test/Debug/../src/test.cpp:15: undefined reference to `clock_gettime'
make: *** [test] Error 1
make: Target `all' not remade because of errors.

**** Build Finished ****

但是,我仍然收到有关未定义对 clock_gettime 的引用的错误。这是我的代码:

#include <iostream>
#include <time.h>
using namespace std;

timespec diff(timespec start, timespec end);

int main()

    timespec time1, time2;
    int temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
    for (int i = 0; i< 242000000; i++)
        temp+=temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
    cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<endl;
    return 0;


timespec diff(timespec start, timespec end)

    timespec temp;
    if ((end.tv_nsec-start.tv_nsec)<0) 
        temp.tv_sec = end.tv_sec-start.tv_sec-1;
        temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
     else 
        temp.tv_sec = end.tv_sec-start.tv_sec;
        temp.tv_nsec = end.tv_nsec-start.tv_nsec;
    
    return temp;

有人可以帮忙吗?

【问题讨论】:

@chrisaycock 在 ICC 上有 -L 用于目录和 -l 用于库文件。你认为我应该尝试 -l librt.a 和 -L /usr/lib/x86_64-linux-gnu/ ? 【参考方案1】:

看起来您根本没有链接librt.a,因为链接器忽略了-l。也许您应该使用-lrt 并可选择通过-L 提供路径。

icpc  -lrt -L/usr/lib/x86_64-linux-gnu -o "test"  ./src/test.o

请注意,-l 与其参数之间没有空格。我也将“librt.a”列为rt;链接器将自行添加其余部分。

【讨论】:

非常感谢您!我没有意识到您必须删除库名称的“lib”部分!【参考方案2】:

除了将 -lrt 添加到链接器标志之外,强烈建议将 -Wl, -no-as-needed 也添加到链接器标志中。 来自 ma​​n ld 的参考:

--根据需要

--不需要的

此选项会影响命令行中在 --as-needed 选项之后提到的动态库的 ELF DT_NEEDED 标记。通常,链接器将为命令行中提到的每个动态库添加一个 DT_NEEDED 标记,无论该库是否实际需要。 --as-needed 导致仅针对满足来自常规目标文件的未定义符号引用的库发出 DT_NEEDED 标记,或者,如果在链接到该点的其他库的 DT_NEEDED 列表中未找到该库,则为未定义来自另一个动态库的符号引用。 --no-as-needed 恢复默认行为。

【讨论】:

以上是关于使用 ICC 在 Linux 中未定义的对 clock_gettime() 的引用的主要内容,如果未能解决你的问题,请参考以下文章

ICC_lab总结——ICC_lab6:版图完成

使用 ifort/icc 时未定义对“main”的引用

linux 内核版本 4.12.8 中未定义的 copy_to_user

C语言编译器icc与gcc编译出来的执行文件有啥区别?

icc2怎么打开数据

如何在 Linux 上执行适用于 x86、arm、GCC 和 icc 的原子操作?