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

时间:2013-06-15 23:10:55

标签: c++ linux ubuntu intel

我正在尝试使用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;
}

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:9)

由于链接器忽略librt.a,因此您似乎根本没有链接-l。也许您应该使用-lrt并可选择通过-L提供路径。

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

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

答案 1 :(得分:0)

除了将 -lrt 添加到链接器标志之外,强烈建议将 -Wl,-no-as-needed 添加到链接器标志中。 引自 man ld

  

- 按需

     

- 无按需

     

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