gcc compiler의 I 옵션의 위치에 대한 질문입니다.

cococo의 이미지

안녕하십니까. 컴파일 하다가 이해 안 되는게 있어서 질문할라고 와보니... 전에 올린 글에 벌써 답글이 올라와 있네요. 고마워서 어쩌나.. ^^;

그래서! 이번 질문은! 제목 대로입니다.
제가 make를 잘 몰라서... 보통은 make 파일 안 만들고 그냥 컴파일하거든요. 그런데 make 파일을 꼭! 만들어야 할 때가 생기면,
여기저기(주로 인터넷)에서 Makefile 복사해서, 적당히 고쳐 씁니다.

근데, 오늘 커널 모듈 컴파일하다가 안되서 make파일 이러저리 뜯어보다가... 이상한 게 보이더라구요.
gcc의 I 옵션은 , include 할 때 header 파일의 추가를 위해 사용되는 걸로 알고 있는데요. 제가 복사한 Makefile에서는 이게 소스 파일 앞에 붙네요? 그러니까...

gcc -I/MyUsr/src/linux/include -c mymodule.c

이런 식으로요.
근데, 전에 어딘가 본 책에서, -L이랑 -l(소문자 L), -I는 소스 파일 앞에 붙이면 complie할 때(cc) 옵션으로 인식되기 때문에, link옵션에 적용 안 될 가능성이 있다. 그래서, 소스 파일 뒤에 붙여야 한다....라는 걸 읽은 기억이 납니다. (그래서 전 지금까지 위의 옵션은 모두 소스 파일 뒤에 붙입니다만...)

제가 잘못 알고 있는 건지요? 혹시 아시는 분 답변 해 주시면 감사하겠습니다. 참고로, 저는 옵션 위치를 바꿔서 에러가 났던 적은 없던 걸로 기억합니다.(물론 에러가 난 줄도 몰랐을 수도 있구요. :) )

monpetit의 이미지

링크할 때엔 -I 옵션이 필요 없습니다. -I 는 컴파일할 때에만 필요합니다.

cinsk의 이미지

ckbcorp wrote:

근데, 전에 어딘가 본 책에서, -L이랑 -l(소문자 L), -I는 소스 파일 앞에 붙이면 complie할 때(cc) 옵션으로 인식되기 때문에, link옵션에 적용 안 될 가능성이 있다. 그래서, 소스 파일 뒤에 붙여야 한다....라는 걸 읽은 기억이 납니다. (그래서 전 지금까지 위의 옵션은 모두 소스 파일 뒤에 붙입니다만...)

기억이 흐려지신 것 같습니다. -I와 -L은 그 위치가 중요한 적이 없습니다.
다만 라이브러리를 지정하는 -lxxx은 그 위치가 대개 맨 뒤에 위치해야 했습니다.
(요사이 gcc는 상관없음) 또한 링크할 라이브러리가 여러 개인 경우, 이 순서도
중요합니다.

익명 사용자의 이미지

-lm 옵션 때문에 한참을 헤멨습니다. ubuntu 11.10의 gcc에서 -lm 옵션을 소스파일 앞에 붙이면 링크에러가 나더라고요. -lm은 특별한 위치가 필요한가요? 아니면 다른 문제인가요?

~/build/yaffs2utils/src $ gcc -lm pow.c -o pow
/tmp/cc7ELZdW.o: In function `main':
pow.c:(.text+0x2b): undefined reference to `pow'
collect2: ld returned 1 exit status
~/build/yaffs2utils/src $ 
 
~/build/yaffs2utils/src $  gcc  pow.c -o pow -lm
~/build/yaffs2utils/src $ ./pow
7 ^ 3 = 110224.000000
4.73 ^ 12 = 125410439.217423
32.01 ^ 1.54 = 208.036691
1.000000
~/build/yaffs2utils/src $
 
~/build/yaffs2utils/src $ gcc -v
Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6.1/lto-wrapper
Target: i686-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.1-9ubuntu3' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
Thread model: posix
gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) 
~/build/yaffs2utils/src $ 

bushi의 이미지

소중한 답변 찾은 것을 감축드립니다.

하옵고,
static library 가 아닌 한 -l(소문자 엘)의 위치나 순서 역시 신경쓰시지 않으셔도 됩니다.
static library 일 경우, 똑똑한 링커가 사용되지 않는 심볼이라 판단하고 제외시켜 버리는 경우를 막기 위해 순서를 잘 지켜줘야 하고요.

static library 일 경우에도 순서를 무시하고 싶으시면 링커의 --start-group 과 --end-group 옵션을 찾아서 읽어보시고요.
링커에게 넘겨 줄 옵션이라는 것을 gcc wrapper 에게 알려주려면 -Wl 옵션을 사용하면 됩니다.

[bushi@rose net]$ gcc -lm pow.c -o pow
 
[bushi@rose net]$ gcc -static -lm pow.c -o pow
/tmp/ccNTqFkp.o: In function `main':
pow.c:(.text+0x2b): undefined reference to `pow'
collect2: ld returned 1 exit status
 
[bushi@rose net]$ gcc -static -Wl,--start-group -lm pow.c -Wl,--end-group -o pow1
[bushi@rose net]$ 
[bushi@rose net]$ gcc -static  pow.c -o pow2 -lm
[bushi@rose net]$ 
[bushi@rose net]$ ls -l pow1 pow2
-rwxrwxr-x 1 bushi bushi 620932 2011-12-01 12:20 pow1
-rwxrwxr-x 1 bushi bushi 620932 2011-12-01 12:20 pow2
[bushi@rose net]$ 

ubuntu 11.10 에서 뭐가 어떻게 잘못 됐는지는 잘 모르겠습니다.
개인적으론, ubuntu 는 장난감으로썬 그럭저럭 가지고 놀 만 하지만,
밥 벌어먹고 살 개발머신에 쓸 Operating System 이 아니라 생각하기 때문에 무척 너그럽게 그때그때 상황봐서 대강대강 처치하고 넘어갑니다.
대단히 질 나쁜 답변이지만, 원인을 찾아서 밝히기 보단 그냥 Makefile에서 적당히 처치하고 넘어가는 식으로 사용하세요 -.-;

익명 사용자의 이미지

대단히 질 나쁜 답변이 대단히 큰 도움이 됐습니다. 감사합니다.
우분투 gcc는 요사이 gcc가 아니라고 생각하는 게 속 편하겠네요.

cococo의 이미지

궁금했었는데... 결국 상관 없었던 거군요. -L만 신경쓰면 되는 거네요. -_-;

답변 감사합니다! 점심 맛나게 드세요!

댓글 달기

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