fopen64와 -D_GNU_SOURCE와의 관계

alfalf의 이미지

8GB 정도의 크기를 가지는 파일을 핸들 할일이 있어 fopen64를 사용했는데 그냥 컴파일 했더니 아래와 같은 경고 메세지가 떠서

warning: implicit declaration of function `fopen64'
warning: assignment makes pointer from integer without a cast

gcc 컴파일시 -D_GNU_SOURCE 옵션을 주었더니 경고없이 컴파일이 잘 되네요.

물론 fopen 함수에 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 옵션으로 컴파일 해도 잘 되기는 하지만 아래와 같은 의문이 생기네요.

궁금한것은 fopen64와 GNU와 어떤 관계인가 하는 겁니다. fopen64가 glibc에서만 지원되는 함수인가요? 그리고 다른 시스템에서는 대형 파일을 다룰때 fopen만으로 가능한건가요?

그럼. 부탁드리겠습니다.

Necromancer의 이미지

Fopen64와 GNU와는 아무 상관 없습니다.

단지 2G 넘는 파일들을 처리하기 위해서 필요한대로 만들었을 뿐입니다.

그리고 fopen64는 시스템별로 구현되지 않은 것도 있을 수 있고, 다른 함수로

구현된 것도 있을겁니다.

Written By the Black Knight of Destruction

purewell의 이미지

#include <stdio.h>

혹은

#include <cstdio>
using namespace std;

윗분 말씀대로 GNU와 상관 없고,
ㅡ_-) 경고 내용으로 봐서는 fopen64를 정의 안 하고
사용했다는 이야기인데... stdio의 함수들은 include 하지 않아도
오류를 발생하지 않더군요.

// #include <stdio.h>

int main(void)
{
  printf("움하하하\n");
}

위의 코드를 그냥 컴파일하면 ㅡ_-); 컴파일 됩니다.
질문에서 나온 경고가 뜨면서요...

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

kslee80의 이미지

자세한것은 glibc 소스 최상위 디렉토리의 NOTES 파일을 보시면 아시겠지만,
_LARGEFILE_SOURCE, _LARGEFILE64_SOURCE, _FILE_OFFSET_BITS
등은 LFS extension을 위한 것들이며,
_GNU_SOURCE 는 단지 NOTES 파일에 설명되어 있는 많은 매크로들을
다 정의하는 매크로일 뿐입니다. 그렇기에 _GNU_SOURCE 를 정의하더라도
fopen64() 같은 평션을 사용할수 있는 것입니다.

GNU 와 LFS 의 관계라....
큰 관련성이 있다고는 생각되지 않네요.
LFS 지원이 glibc 에 추가되어 있다고 해도, 커널에서 지원해주지 않는다면
사용할수 없습니다.(동작을 제대로 하지 않죠;;)
그렇기에 GNU 단독적인 것이라고는 보기 힘들듯 싶습니다.

PS) glibc 풀소스가 없으시다면 이 링크로 NOTES 파일을 보세요.
http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/NOTES?rev=1.5&content-type=text/x-cvsweb-markup&cvsroot=glibc

alfalf의 이미지

감사합니다.
덕문에 제 의문이 모두 풀렸네요.
맨 마지막분 답글을 보니
앞으로는 보다 정교하게 옵션을 사용해야 겠네요.
그럼. 모두들 행복하시길 빌면서 이만...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.