g++, STL 사용하는 방법, 생초보라 알수가 없군요
운영체제: HP-UX ia64-hp-hpux11.31
gcc verion 4.2.3 설치함
STL을 사용하가 위해 아래와 같이 간단하게 테스트용을 만들었는데
설치된 위치는
/usr/local/bin/gcc
/usr/local/bin/g++
/usr/local/include/c++/4.2.3/vector
/usr/local/include/c++/4.2.3/string
// lib 라이브러리
/usr/local/lib/hpux64/
/usr/local/lib/hpux32
/usr/local/lib/gcc
gcc PATH 을 하면 아래 부분만 일시 적입니다.
export PATH="$PATH:/usr/local/bin"
[질문]
1.C++ 을 사용하려고 합니다. 한번에 설치경로를 PATH 설정하는 방법은 없을까요?
ex) vi .profile 여기다가 설정한다고 했는데, 모르겠습니다.
2.C++ STL을 사용하려고 합니다. std::string, std::vector ,map
해당 헤더파일은 존재하는데, 패스를 걸어야 하는지, 아니면, make 파일로 연결해야 하는지
VC++ 에서만 사용하다가, 통 감이 잡히지 않습니다.
이곳에서 계속 뒤져 보았는데, 원하는 찾을수가 없어서.
부탁드립니다. HP-UX는 일반 Linux와 다른가요?, GCC는 동일하다고 생각하고 있는데...
///////////////////////////////////////////////////////////////
#include "stdio.h"
#include "vector"
#include "map"
#include "iostream"
#include "string"int main(int argc, char *argv[])
{std::string str;
str.append("대한민구");
sStrongs.push_back("abc");
sStrongs.push_back("한국");vector::iterator it;
it = sStrongs.begin();
for(int i=0; it != sStrongs.end() ;it++,i++)
{
std::string str = * it;
printf("%s \n", str.c_str());
}
std::string str ="/usr/local/bin/g++";
std::cout<< "Unix G++"<< str <<"\n";
printf("Hello, world 한국\n");
return 0;
}
//--------------------------------------------------------
gcc version 4.2.3
$ g++ -o STL STL_Try.cpp
STL_Try.cpp: In function 'int main(int, char**)':
STL_Try.cpp:16: error: 'sStrongs' was not declared in this scope
STL_Try.cpp:19: error: 'vector' was not declared in this scope
STL_Try.cpp:19: error: 'stirng' was not declared in this scope
STL_Try.cpp:19: error: '::iterator' has not been declared
STL_Try.cpp:19: error: expected `;' before 'it'
STL_Try.cpp:21: error: 'it' was not declared in this scope
STL_Try.cpp:30: error: redeclaration of 'std::string str'
STL_Try.cpp:11: error: 'std::string str' previously declared here
구글
#include "vector" -> #include
#include "vector" -> #include
제가 볼 땐.. 문법이 틀려서 에러가 나는 듯 합니다.
std::string str; 여기를 통과했지요? #include "string";이 문제가 없었다는 뜻이며, include path가 제대로 잡혀 있다는 뜻입니다. 짐작컨대 library path도 제대로 잡혀 있을 것입니다.
vector도 std::vector라고 적어주시거나 namespace resolution이 어떤 식으로든 필요합니다. string인데 stirng으로 오타 내셨구요. sStrongs는 declaration이 없습니다. 또 제가 아는 한 vector iterator에서 어떤 template instance인지, type을 적어줘야 할 것 같습니다.
별개로 본래의 질문에 답변을 드리겠습니다. Unix는 윈도우즈보다 못하지도, 어이없지도 않은 OS입니다. 우선 relax하시구요. ^^;;
첫째, shell을 통해 프로그램을 수행할 때, 프로그램의 이름만(gcc 또는 g++) 주게 되면, shell은 PATH라는 environment variable에 가서, 이 프로그램이 들어있을 만한 위치가 어딘지 확인합니다. echo $PATH 해보세요. bash shell 기준이고, 쓰시는 shell이 bash가 아니라면 약간 문법이 다를 수도 있습니다.
export PATH="$PATH:/usr/local/bin"
저 라인은 shell한테, 원래의 찾던 데 말고 추가로 /usr/local/bin 가서도 해당 프로그램이 있나 찾아보라, 라는 의미입니다. 이걸 bash shell 기준으로 .bashrc에 적어주면, login 하자마자 반영되는데, 다른 쉘은 다른 쉘 나름대로 로그인 후 즉시 읽게 되는, 유저별 설정 파일이 있을 겁니다.
둘째, include는 -c 옵션을 주어 object module로 컴파일할 때(링크하기 전) 필요합니다. 이때 gcc는 기본적으로 몇몇 위치에 가서 header file들이 있나 뒤져봅니다. 헤더파일이 그 위치에 있지 않다면, 컴파일 과정에서 뭔가 이 심볼이 뭔지 알 수 없다, 이런 류의 에러가 납니다. 이때는 -I 헤더파일이_있는_위치 옵션을 gcc에 추가로 주시면 됩니다. 매번 수동으로 하는 게 번거로우니 대개 makefile 같은 데 집어넣습니다.
셋째, 라이브러리 링크는.. 일단 실행파일 만들 때, gcc가 library 위치를 한 번 찾습니다. 이것도 기본으로 설정된 위치가 있습니다. 링크하고자 하는 라이브러리 파일이 이 위치들 중 하나에 없다면, executable file이 빌드되지 않습니다. undefined reference 어쩌고 하는 에러가 흔히 납니다. -L 라이브러리가_있는_위치 -l 라이브러리_이름 옵션을 주셔야 합니다.
넷째, 라이브러리가 DL 또는 shared object면, 실행 순간에 다시 그 라이브러리가 어딨나 찾습니다. 아까 -L 옵션 준 것과는 상관없습니다. 이 역시 별도로 기본적으로 설정된 위치들에다 추가로 LD_LIBRARY_PATH 라는 환경변수에 적혀 있는 경로들까지 뒤집니다. -L -l 옵션을 적절히 주어 빌드가 되었다 해도, 실행할 때, 이 라이브러리가 발견될 수 없는 위치라면, 런타임에 에러가 나게 됩니다. LD_LIBRARY_PATH를 설정해서 해결하실 수 있습니다.
첫째, 넷째는 환경변수를 설정해서 해결하는데, 이 설정이 처음부터 반영되게 하시려면, export 어쩌고 하는 라인을 .bashrc(bash shell 기준)에 적어주시면 됩니다. 둘째, 셋째는 makefile에 넣어주심 되고요.
댓글 달기