簡體   English   中英

在Solaris上使用-D_FILE_OFFSET_BITS = 64時的lseek錯誤

[英]lseek error when -D_FILE_OFFSET_BITS=64 is used on solaris

在Unix上編譯應用程序時,我正在使用-D_FILE_OFFSET_BITS=64標志。 它可以在RHELSuSEHP-uXAIX上正確構建。

在Solaris上,出現以下錯誤:

long lPos = 0L;
long UTMPSIZE = sizeof(struct utmp);
int fd = 0;

fd = open("/etc/utmp", O_RDONLY);
UTMPSIZE = sizeof(struct utmpx);
lPos = lseek(fd, -UTMPSIZE, SEEK_END); // error: conversion from `long int' to non-scalar type `off_t' requested

我在某處讀到-D_FILE_OFFSET_BITS=64 ,它把#defined定義為off_t 如果是這樣,為什么會發生此錯誤?

我在cpp程序中編寫了相同的步驟,並在soalris系統上進行了編譯和執行,並且可以正常工作。 但是,只有在編譯應用程序時,才會看到該錯誤。

這就是我在types.h中所擁有的:

#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)
typedef long long               longlong_t;
typedef unsigned long long      u_longlong_t;
#else
/* used to reserve space and generate alignment */
typedef union {
        double  _d;
        int32_t _l[2];
} longlong_t;
typedef union {
        double          _d;
        uint32_t        _l[2];
} u_longlong_t;
#endif  /* __STDC__ - 0 == 0 && !defined(_NO_LONGLONG) */

#ifndef _OFF_T
#define _OFF_T

#if defined(_LP64) || _FILE_OFFSET_BITS == 32
typedef long            off_t;          /* offsets within files */
#elif _FILE_OFFSET_BITS == 64
typedef longlong_t      off_t;          /* offsets within files */
#endif

#if defined(_LARGEFILE64_SOURCE)
#ifdef _LP64
typedef off_t           off64_t;        /* offsets within files */
#else
typedef longlong_t      off64_t;        /* offsets within files */
#endif
#endif  /* _LARGEFILE64_SOURCE */

#endif /* _OFF_T */

如果我在代碼中使用long long,現在錯誤將更改為“ long long int”。

為了解決上述問題,我添加了#define _FILE_OFFSET_BITS64。發現在標頭之一中,相同的標志值設置為32。我不知道發生了什么,但是使用編譯時標志並沒有覆蓋#define。 然后,我在#include之后添加了以下內容:

#ifdef <SunOS>
#undef _FILE_OFFSET_BITS
#define _FILE_OFFSET_BITS 64
#endif

這樣可以糾正編譯時錯誤。 但是現在還有另一個問題,在stat()調用之后的stat結構成員沒有正確填充。 我不知道為什么會這樣。

非常感謝這里的任何幫助。

錯誤消息的“非標量類型”部分是可疑的,因為這意味着off_t被實現為某種結構而不是64位整數。

gcc是否在Solaris計算機上是最新的? 具體來說,如果在Solaris上使用gcc 4.3.0,則可能遇到GCC錯誤30513( https://gcc.gnu.org/bugzilla/show_bug.cgi?id=30513 )。 如果您在錯誤報告中查看注釋9,您會看到它們得到了非常相似的錯誤:“請求從'jlong​​'轉換為非標量類型'off_t'”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM