Cygwin未定义对adjtime的引用

时间:2015-02-25 11:52:03

标签: c

这是我第一次在这里发帖提问,所以要善意:)。

使用cygwin将Linux应用程序移植到Windows(Windows 7 64位)时遇到问题。我不得不重写一些不受windows支持的代码,而且不存在于cygwin中(如adjtimex),我已经设法编译代码但是当我构建应用程序.exe文件(通过使用makefile)时,我得到了一个链接错误:

gcc  -Wl,-Map,ppsi.map2 -o ppsi ppsi.o -lrt -lc
ppsi.o: In function `win_time_adjust':
ppsi/time-win/win-time.c:74: undefined reference to `adjtime'
ppsi/time-win/win-time.c:74:(.text+0x1905): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `adjtime'

定义了adjtime函数,其中包含代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/time.h> /* timex.h not available on windows so we use sys/time.h*/
#include <ppsi/ppsi.h>

以下是代码的一部分:

static int win_time_adjust(struct pp_instance *ppi, long offset_ns, long freq_ppb){
struct timeval t;
int ret;
t.tv_sec = 0;
t.tv_usec = 0;

if (offset_ns) {
    t.tv_sec = offset_ns / 1000000; 
    t.tv_usec = offset_ns / 1000;  /*microseconds */
}

ret = adjtime(&t, NULL);
pp_diag(ppi, time, 1, "%s: %li %li\n", __func__, offset_ns, freq_ppb);
return ret;
}

之前我遇到过类似的问题,我在编译应用程序时通过链接缺少的库来解决。我在这里累了相同并链接libc(因为adjtime假设在那里)-lc编译但得到相同的错误。我不确定adjtime是如何定义的,我想知道是否有一些我应该链接的cygwin库?

编译时使用cygwin(gcc版本4.9.2)

1 个答案:

答案 0 :(得分:0)

根据我的理解,adjtime是一个Linux主义,它可能通过FreeBSD爬进BSD世界。任何C或POSIX标准都无法记录它。

即使那些由C和POSIX标准记录的内容通常也未在Microsoft世界中正确实现,因此我不会对此功能不存在感到惊讶。

我很想知道关于你的这个项目的更多信息。虽然为了便携性的目的,可以编写一些实现定义的东西的简单包装,但我只能想象高度利基的用例,有更好的选择:

  • 如果您需要具有大量良好,安全的熵来为您的伪随机数生成器播种,您应该使用加密库提供的内容。
  • 如果您想进行性能测试,您应该学习如何使用分析器而不是滚动自己的分析代码。此外,每次“性能测试”都应该像科学家第一次观察的那样进行;通常最好不要让以前项目的测试指导未来项目的优化。相反,让当前项目的配置文件引导当前项目的优化(在当前硬件上),并且在你知道它之前你会欢呼!