user997112
user997112

Reputation: 30645

Undefined reference to clock_gettime() in Linux using ICC

I am trying to get the code (see far below) working on Ubuntu. The code uses clock_gettime(). I think I have successfully linked to 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 ****

However, I still get the error about undefined reference to clock_gettime. This is my code:

#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;
}

can someone please help?

Upvotes: 5

Views: 9864

Answers (3)

SaintFTS
SaintFTS

Reputation: 51

Clang on answer:

If you're using clang on MinGW, you can solve this problem by adding -lpthread in your compilation sequence.

clang -o main.exe main.c --target=x86_64-w64-mingw -lpthread

That's because for my particular platform (64bit windows + MinGW binaries), clock_gettime() is located in pthread_time.h. Unlike GCC, clang doesn't link the pthread library automatically.

Upvotes: 0

ryan_tu
ryan_tu

Reputation: 574

Besides adding -lrt to the linker flags, it's strongly recommended to add -Wl, -no-as-needed to the linker flags as well. Ref from man ld:

--as-needed

--no-as-needed

This option affects ELF DT_NEEDED tags for dynamic libraries mentioned on the command line after the --as-needed option. Normally the linker will add a DT_NEEDED tag for each dynamic library mentioned on the command line, regardless of whether the library is actually needed or not. --as-needed causes a DT_NEEDED tag to only be emitted for a library that satisfies an undefined symbol reference from a regular object file or, if the library is not found in the DT_NEEDED lists of ther libraries linked up to that point, an undefined symbol reference from another dynamic library. --no-as-needed restores the default behaviour.

Upvotes: 0

chrisaycock
chrisaycock

Reputation: 37928

It looks like you haven't linked librt.a at all since the linker is ignoring -l. Perhaps you were supposed to use -lrt and optionally give the path via -L.

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

Notice I have no spaces between the -l and its parameter. I also have listed "librt.a" as merely rt; the linker will add the rest on its own.

Upvotes: 10

Related Questions