我正在尝试让代码(见下文)在 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;
}
有人可以帮忙吗?
看起来您根本没有链接
librt.a
,因为链接器忽略了 -l
。也许您应该使用 -lrt
并可选择通过 -L
给出路径。
icpc -lrt -L/usr/lib/x86_64-linux-gnu -o "test" ./src/test.o
注意,
-l
及其参数之间没有空格。我还将“librt.a”仅列为 rt
;链接器将自行添加其余部分。
除了将 -lrt 添加到链接器标志之外,强烈建议也将 -Wl, -no-as-needed 添加到链接器标志。 参考来自man ld:
--按需
--无需按需
此选项影响命令行中 --as-needed 选项之后提到的动态库的 ELF DT_NEEDED 标记。 通常,链接器将为命令行中提到的每个动态库添加 DT_NEEDED 标记,无论该库是否实际需要。 --as-needed 导致仅针对满足来自常规目标文件的未定义符号引用的库发出 DT_NEEDED 标记,或者,如果在链接到该点的库的 DT_NEEDED 列表中找不到该库,则发出未定义的标记来自另一个动态库的符号引用。 --no-as-needed 恢复默认行为。
如果您使用 clang,则可以通过在编译序列中添加 -lpthread 来解决此问题。
clang -o main.exe main.c --target=x86_64-w64-mingw -lpthread
这是因为对于我的特定平台(64位Windows + MinGW二进制文件),clock_gettime()位于pthread_time.h中,与gcc不同,clang不会自动链接pthread库。