gcc 로 컴파일 할때 특정 헤더파일을 gcc의 인자로 넘겨서 헤더파일을 추가하게끔 할수 없을지..

puaxx의 이미지

지금 어떤 프로그램을 컴파일 하고 있는데

소스를 고치는 방법말고

gcc 로 컴파일 할때 특정 헤더파일을 gcc의 인자로 넘겨서 헤더파일을 포함하게끔 할수 없을지..

ktd2004의 이미지

"-include 파일명" 옵션이 아닐까요?(확인은 해보지 않았습니다.)

전웅의 이미지

> 지금 어떤 프로그램을 컴파일 하고 있는데
> 소스를 고치는 방법말고
> gcc 로 컴파일 할때 특정 헤더파일을 gcc의 인자로 넘겨서 헤더파일을 포함하게끔 할수 없을지..
>

-include 옵션도 가능합니다만, 소스 내 include 되는 위치나
경로 문제를 고민하고 싶지 않다면 다음 방법도 쓸만 합니다.
(더구나 이식성도 있군요!! ㅋ)

#ifndef INCLUDE_FILE
#define INCLUDE_FILE "default.h"
#endif
 
#include INCLUDE_FILE

그리고, gcc 실행시에는

gcc -D INCLUDE_FILE=\"user.h\" source.c

와 같이 해줍니다. INCLUDE_FILE 을 따로 정의해주지 않으면
"default.h" 가 #include 됩니다.

gcc 실행시 쌍따옴표를 escape 하는 것이 맘에 안드신다면

#ifndef FILE_NAME
#define INCLUDE_FILE "default.h"
#else
#define XARG(x) #x
#define ARG(x) XARG(x)
#define INCLUDE_FILE ARG(FILE_NAME)
#endif
 
#include INCLUDE_FILE

그리고

gcc -D FILE_NAME=user.h source.c

로 해줄 수도 있습니다.

--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org (서버 공사중)

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

bushi의 이미지

최근에 리눅스 커널 2.6.18 부터 #include 대신 -include config.h 를 사용하기 시작했습니다.
아무리 생각해봐도 마땅한 이유가 생각나지는 않고,
그저 소스에서 한 줄을 줄이려는 목적이 아닌가 생각됩니다.
커널 소스 전체적으로 수천에서 수만 바이트의 용량이 줄어드는 효과가 있겠지요.
어차피 리눅스 커널은 gcc 아닌 다른 컴파일러로 컴파일하기가 불가능에 가까우므로...

질문자의 목적이 소스코드 용량을 줄이려는 목적이 아니라면,
위의 방법이 바른 길이라 생각됩니다.
실제로 저도 저렇게 사용합니다.

하지만, 제가 보기엔...
기존의 소스 덩어리를 수정하지 않고 뭔가를 간단히 바꿔보기 위한 방법을 찾고 계신 것 같습니다.

전웅의 이미지

> 최근에 리눅스 커널 2.6.18 부터 #include 대신 -include config.h 를 사용하기 시작했습니다.
> 아무리 생각해봐도 마땅한 이유가 생각나지는 않고,
> 그저 소스에서 한 줄을 줄이려는 목적이 아닌가 생각됩니다.
> 커널 소스 전체적으로 수천에서 수만 바이트의 용량이 줄어드는 효과가 있겠지요.
> 어차피 리눅스 커널은 gcc 아닌 다른 컴파일러로 컴파일하기가 불가능에 가까우므로...
>

불필요한 매크로명 예약도 피하고 귀차니즘도 만족하기
위해서가 아닐까요? :-)

> 질문자의 목적이 소스코드 용량을 줄이려는 목적이 아니라면,
> 위의 방법이 바른 길이라 생각됩니다.
> 실제로 저도 저렇게 사용합니다.
>
> 하지만, 제가 보기엔...
> 기존의 소스 덩어리를 수정하지 않고 뭔가를 간단히 바꿔보기 위한 방법을 찾고 계신 것 같습니다.
>

소스를 일절 수정하지 않고 파일만 #include 해서 의미있는 결과를 얻어
내기란 쉽지 않습니다. :-)

단지

#include 매크로명

의 형태가 표준에 새로 추가된 이유가 "바로" 원 질문자가 질문하신
상황이기에 이런 방법도 있을 수 있음을 보였습니다 - 메뉴는 펼쳐져 있고
맘에 드는 것 골라서 드시면 되겠네요.

한가지 유의할 점은 -include 의 경우 옵션을 통해 #include 되는 파일이
삽입되는 위치가 일반적인 #include 문을 사용하는 위치가 다소 다릅니다.
보통 코드 상에서는 표준 헤더, 그 외 준표준 헤더, 사용자 헤더의 순으로
#include 합니다만, -include 옵션은 무조건 해당 파일의 가장 처음에
#include 되는 것으로 처리합니다.

또한, 파일을 찾는 경로 역시 (일반적인 #include "file.h" 형태처럼)
컴파일 되는 소스 파일의 디렉토리부터가 아니라 전처리기 작업 디렉토리
부터 찾게 됩니다.

그와 같은 차이만 염두에 두신다면 용도에 맞춰 사용하시는데 아무 문제가
없습니다.

--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org (서버 공사중)

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

bushi의 이미지

[bushi@rose ~]$
[bushi@rose ~]$ cat ii.h
#define WHAT_SOMETHING "I am."
[bushi@rose ~]$
[bushi@rose ~]$ cat ii.c
#include <stdio.h>
int main(int argc, char *argv[])
{
        printf("%s\n", WHAT_SOMETHING);
        return 0;
}
[bushi@rose ~]$
[bushi@rose ~]$ gcc -s -include ii.h -o ii ii.c
[bushi@rose ~]$
[bushi@rose ~]$ ./ii
I am.
[bushi@rose ~]$
lovewar의 이미지


특정 헤더 파일의 내용을 치환하는 방법도 있지 않을까 생각합니다.

하지만, 썩 좋아 보이지는 않습니다.

seank76의 이미지

원래의 소스를 터치하실수 없는 경우에 많이 쓰는데요,

콤파일 하실때 새로운 디렉토리를 제일 처음 include 디렉토리로 정의해 두세요.

ex) gcc -I/home/me/include_override ...

그리곤 그 디렉토리에 소프트 링크를 생성하시면 됩니다.

예를 들어 소스에서 foo.h를 대체하시려면

ln -s [path_to_new_header] /home/me/include_override/foo.h

이렇게 하시면 되죠.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.