gcc에서 STL사용

simpid의 이미지

Windows에서 VC를 이용해 개발해 왔습니다.

그래서 그런지 gcc를 사용하면서 어려움이 많습니다.

gcc기능을 테스트하기 위해 간단한 STL사용해서 간단한 프로그램을 작성해 봤는데...
컴파일은 문제가 없는데 링크과정에서 오류가 발생합니다.

저는 그냥 gcc -o template template.cpp 등으로 컴파일하는데..
STL을 사용하려면 뭔가 특별한 조치가 필요한가요?

저는 Redhat Linux9을 설치했고, gcc와 관련해서 설정을 조정한건 없습니다.
그냥 아나콘다에서 제안하는 기본 설정을 사용했습니다.

설치되어 있는 gcc는 3.2.2 버젼입니다.

cedar의 이미지

gcc가 아니라 g++을 써야 합니다. -_-a

markboy의 이미지

g++ 로 해보셨나요?

sori1024의 이미지

c++은 컴파일 할때 C++로 하셔야 합니다

C는 GCC로 하시고요]

저두 저번에 어떤책에서 보고 그냥 gcc로 했다가 낭패를 당한적이 있습니다

vigor96의 이미지

-lstdc++

이렇게 추가하셔도 됩니다.

gcc 에서 기본라이브러리로 stdc++ 가 잡혀 있지 않답니다.

g++ 은 기본라이브러리로 잡혀 있죠..

eungkyu의 이미지

단지 라이브러리만의 차이는 아닙니다.
gcc는 C language compiler,
g++을 C++ language compiler입니다.

vigor96 wrote:
-lstdc++

이렇게 추가하셔도 됩니다.

gcc 에서 기본라이브러리로 stdc++ 가 잡혀 있지 않답니다.

g++ 은 기본라이브러리로 잡혀 있죠..

vigor96의 이미지

eungkyu wrote:
단지 라이브러리만의 차이는 아닙니다.
gcc는 C language compiler,
g++을 C++ language compiler입니다.

아니죠

cc 가 C 컴파일러

g++ 이 c++ 컴파일러

이고

gcc 가 그 관문을 하는 역할이죠.

아닌가요?.~~~

eungkyu의 이미지

vigor96 wrote:
아니죠

cc 가 C 컴파일러

g++ 이 c++ 컴파일러

이고

gcc 가 그 관문을 하는 역할이죠.

아닌가요?.~~~

아닙니다. -_-

cc라는 것은 보통의 유닉스에서 밴더들이 C Compiler를 제공하면서
그 명령 이름이 cc (C Compiler의 준말이겠죠... 당연히..) 가 된 것이고,
gcc와는 하등의 관련이 없습니다.

GCC(GNU Compiler Collection: 최근(?)에 이 이름이 생겼죠) 라는 것은
GNU에서 만들었고, 만들고 있는데, 그 중에서 C Compiler는 gcc,
C++ Compiler는 g++, Java Compiler는 gcj, 이런 식으로 나가는 것입니다.

물른 이러한 컴파일러들이 backend늘 동일하고 frontend만 다른 것일지
하더라도 같은 backend에서 C용 frontend를 단 것이 gcc이고 C++용
frontend를 단 것이 g++이지, gcc에 C++ 라이브러리를 링크시킨다고
해서 C++ Compiler가 되는 것은 아닙니다. 단지 문법이 비슷하니까 컴파일이
되기도 하는 것이겠죠.

sylphong의 이미지

gcc -x c++ 옵션을주면 c++로 컴파일합니다...물론 내부적으로 g++을 부르겠지만요..
옵션없이하면 C문법으로 컴파일하니 각종에러가 뜰겁니다..

zendar의 이미지

예전에 kldp에 올라온 문서에서 gcc는 확장자에 따라서 c 컴파일러나 C++ 컴파일러를 호출해준다는 글을 읽은적이 있는데....

garuna의 이미지

제가 알기론 g++ 은 c++ 컴파일러라기 보다는 c++ 언어를 c 언어로 바꿔주는 일종의 pre-processor(개념상 비슷하다고 생각해 이렇게 표현했을 뿐입니다.) 라고 알고있습니다.

결국 g++ 은 c++ 소스를 c 소스로 바꾸고, gcc 를 이용하여 실행파일을 만들어 내는 것으로 알고 있습니다.

pynoos의 이미지

초기의 C++ compiler들은 c code 를 만들어 내는 wrapper였지만,

현재 gcc/g++ 은 내장 compiler가 다르게 되어 있습니다.

-v option을 넣어서 .cc 와 .c 의 compiler를 확인해 보세요.

vigor96의 이미지

eungkyu wrote:
vigor96 wrote:
아니죠

cc 가 C 컴파일러

g++ 이 c++ 컴파일러

이고

gcc 가 그 관문을 하는 역할이죠.

아닌가요?.~~~

아닙니다. -_-

cc라는 것은 보통의 유닉스에서 밴더들이 C Compiler를 제공하면서
그 명령 이름이 cc (C Compiler의 준말이겠죠... 당연히..) 가 된 것이고,
gcc와는 하등의 관련이 없습니다.

GCC(GNU Compiler Collection: 최근(?)에 이 이름이 생겼죠) 라는 것은
GNU에서 만들었고, 만들고 있는데, 그 중에서 C Compiler는 gcc,
C++ Compiler는 g++, Java Compiler는 gcj, 이런 식으로 나가는 것입니다.

물른 이러한 컴파일러들이 backend늘 동일하고 frontend만 다른 것일지
하더라도 같은 backend에서 C용 frontend를 단 것이 gcc이고 C++용
frontend를 단 것이 g++이지, gcc에 C++ 라이브러리를 링크시킨다고
해서 C++ Compiler가 되는 것은 아닙니다. 단지 문법이 비슷하니까 컴파일이
되기도 하는 것이겠죠.

약간의 어감 차이가 있는 것 같습니다.

제가 이해한 것은 다음과 같습니다.

즉 gcc 는 프론트 엔드 역할을 한다는 거죠

link 할때는 ld 호출하고

c 컴파일할때는 cc1 호출하고 ( cc 라고 한건 저의 착각이었습니다. )

c++ 컴파일할때는 cc1plus 호출 하고

이렇게 되는 거 아닌가요?.

혹시나 해서 g++ man 페이지를 검색해 봤습니다.

다음과 같은 말이 나오더군요.

The C and C++ compilers are integrated; g++ is a script to
call gcc with options to recognize C++. gcc processes
input files through one or more of four stages: prepro-
cessing, compilation, assembly, and linking. This man
page contains full descriptions for only C++ specific
aspects of the compiler, though it also contains summaries
of some general-purpose options. For a fuller explanation
of the compiler, see gcc(1).

g++ 은 gcc 에 c++ 에 관한 몇개 옵션을 넘겨 주는 script 에 불과하다는 것을 알 수 있습니다.

g++ => gcc => cc1plus 이런식으로 호출해서 c++ 화일이 컴파일된다고 할 수 있죠.

-lstdc++ 은 g++ 로 했을 때 자동으로 붙는 library 라 이해할 수 있고요..

틀린점이 있다면 지적해 주셨음 합니다.~~~~^_^

agfe2의 이미지

man gcc, man g++
모두 gcc 매뉴얼 페이지가 보입니다.
-v 옵션을 사용해도 동일한 옵션과 버전정보가 표시됩니다.

gcc 를 사용하건 g++ 을 사용하건 기본적으로
c 및 c++ 파일을 컴파일하는 데는 문제가 없고요.

단지 링크할때 차이가 발생합니다.
g++ 을 사용하면 앞서 다른분들이 설명하신 것처럼 c++ 관련 라이브러리가 자동으로 링크되며,
gcc 를 사용할 경우는 별도로 -lstdc++ 를 추가해줘야 합니다.

결국 gcc랑 g++ 은 c++ 파일링크시에만 차이가 있는 것입니다.

앞서 설명들중 컴파일 할 때 "-x c++" 이 필요한 경우는
gcc컴파일러에서 파일 확장자를 c++ 로 인식하지 못할 때이며,
c++, cpp, cp, cc, cxx, C 를 확장자로 갖는 파일에서는
gcc에서 자동으로 c++로 컴파일합니다.

결국 vigor96님 설명이 정확하네요.

사랑과 평화 넘치는 행복한 세상을 꿈꾸며

사랑과 평화 넘치는 행복한 세상을 꿈꾸며

eungkyu의 이미지

제가 놓치고 있는 것도 몇개 발견할 수 있었습니다. :)

중요한 것은, 적어도 지금 "GCC"에서 C++ 프로그램을 컴파일할 때 C 코드를 중간결과로 내놓지 않는다는 점입니다. C compiler와 C++ compiler의 frontend는 다르다는 것이지요...

GCC manual을 보면 다음과 같은 말을 볼 수 있습니다.

Quote:
G++ is a compiler, not merely a preprocessor. G++ builds object code directly from your C++ program source. There is no intermediate C version of the program. (By contrast, for example, some other implementations use a program that generates a C program from your C++ source.) Avoiding an intermediate C representation of the program means that you get better object code, and better debugging information. The GNU debugger, GDB, works with this information in the object code to give you comprehensive C++ source-level editing capabilities (see C and C++).

댓글 달기

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