[질문] 공유라이브러리 사용시 헤더파일 없어도..

오호라의 이미지

shared.c
 
#include<stdio.h>
 
void foo ( void )
{
    printf( "I'm foo\n" );
}
 
void bar ( void )
{
    printf( "I'm bar\n" );
}
 
> gcc -shared -o libxxx.so shared.c

main.c
 
int main ( int argc, char* argv[] )
{
    foo();
    bar();
 
    return 0;
}
 
> gcc -L./ -lxxx -o main main.c

[질문]

main.c:7: warning: implicit declaration of function 'foo'
main.c:8: warning: implicit declaration of function 'bar'

main.c 컴파일타임에서 에러가 없는게 당연하게 아닌가요?

어떤 분이 헤더(프로트타입)가 없는데 어떻게 컴파일에러가 안나냐고 우기시는데...

지식이 짧으신 분이라서 그냥 그러려니하고 함구했는데...

혹시나 해서요. ^^;

라키시스의 이미지

컴파일러가 C99 표준을 엄격히 준수한다면,
함수의 prototype이 선언되지 않은 상태에서 호출되었을 경우 에러가 나는 것이 맞지만,
그렇지 않고, C89, C90등을 따른다면,
그렇게 하지 않더라도 에러는 나지 않는다고 알고 있습니다.
대신 암묵적으로 리턴값과, argument들을 컴파일러가 가정하고 컴파일 한다고 알고 있는데요...;;;
정확히 찾아보고 답글 적는 것이 아니지만, 아마 맞을 겁니다 ^^;;

오호라의 이미지

test.c
 
#include<stdio.h>
 
int main ( int argc, char* argv[] )
{
    foo();
    bar();
    return 0;
}

> gcc -W -Wall test.c

test.c: In function ‘main’:
test.c:5: warning: implicit declaration of function ‘foo’
test.c:6: warning: implicit declaration of function ‘bar’
test.c: At top level:
test.c:3: warning: unused parameter ‘argc’
test.c:3: warning: unused parameter ‘argv’
/tmp/ccMyn5Xd.o: In function `main':
test.c:(.text+0x15): undefined reference to `foo'
test.c:(.text+0x1f): undefined reference to `bar'
collect2: ld returned 1 exit status

> gcc -W -Wall -c test.c

test.c: In function ‘main’:
test.c:5: warning: implicit declaration of function ‘foo’
test.c:6: warning: implicit declaration of function ‘bar’
test.c: At top level:
test.c:3: warning: unused parameter ‘argc’
test.c:3: warning: unused parameter ‘argv’

에러가 나는 시점은 ld 시점이죠.

혹시나 했는데 역시나였습니다. 감사합니다.

그 분말씀에 혹해서...

예전에 그분이 저보고 이렇게 쓰는 사람은 첨본다고, 이게 맞냐고, 정확하냐고, 의심을 했던게 떠오르네요.

> make && make install

(ㅡㅡ;)..

Hello World.

bushi의 이미지

의존성을 생각해서 제대로 만들어진 Makefile 이라면,

make && make install
할 바엔 그냥
make install
을 하겠습니다.

아무튼,
make all install
보다도 더 껄끄럽다는 점에서는 저도 동의합니다.

OTL

라키시스의 이미지

사족이지만, C89, C90 등의 C 언어 표준 번호(?)에 대해 문득 의문이 생겨서 잠시 위키피디아를 찾아 보았습니다.

Quote:
In 1989, the standard was ratified as ANSI X3.159-1989 "Programming Language C." This version of the language is often referred to as ANSI C, Standard C, or sometimes C89.
In 1990, the ANSI C standard (with a few minor modifications) was adopted by the International Organization for Standardization (ISO) as ISO/IEC 9899:1990. This version is sometimes called C90. Therefore, the terms "C89" and "C90" refer to essentially the same language.

요약하면, 89년 ANSI에 의해 비준된 안을 C89라고 하며, 이것을 90년에 ISO가 표준으로 채택한 것을 C90이라고 한다. 따라서 C89와 C90은 동일한 언어를 가리킨다고 하네요.

harisoo의 이미지

.

harisoo의 이미지

.

lso0502의 이미지

[위선,거짓, 인간의 모든 추악함에서 꿋꿋이 살아가는 굶주린 영혼이여 편안한 휴식이 찾아오길 기원하겠습니다.]

[위선,거짓, 인간의 모든 추악함에서 꿋꿋이 살아가는 굶주린 영혼이여 편안한 휴식이 찾아오길 기원하겠습니다.]

댓글 달기

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