검색결과 리스트
글
이전 Post에 이어서 이번 Post에서는 Eclipse를 사용하여 Autotools Project를 직접 만들어 보면서 개발하는데 발생하는 여러가지 문제들을 해결해 보도록 하겠습니다.
5. Autotools Project 생성
설치 및 설정을 마쳤으니 이제 Eclipse를 사용해서 Autotools Project(C Project)를 만들어 봅시다.
C Project를 새로 만들기 위해서 Eclipse를 실행한 다음, File -> New -> C Project를 Click합니다.
C Project Dialog에서 다음의 항목을 입력한 후 Next를 누릅니다.
- Project Name : Project의 이름을 입력합니다.
- Project Type : GNU Autotools -> Hello World ANSI C Autotools Project를 선택합니다. Empty Project를 선택하면 거의 처음부터 Autotools Project를 만드는 것이나 마찬가지이기 때문에 편의를 위해서 이것을 선택합니다.
- Toolchains : GNU Autotools Toolchain을 선택합니다.
그 다음에는 Project의 기본 정보를 입력하고 Next를 Click합니다. Author, Copyright notice은 Main Source File에 주석으로 추가되는 내용이니 편하게 적으면 됩니다. 각 항목에 다음과 같이 입력합니다.
- Author : Project의 개발자의 이름을 입력합니다.
- Copyright notice : Project의 License를 입력합니다.
- Hello world greeting : Hello World 대신 다른 Text를 Console에 출력하려면 여기에 Text를 입력합니다.
- Source : Project Directory에서 Source File들이 위치할 Directory 이름을 입력합니다.
마지막으로 Project의 설정을 지정할 수 있습니다. 여기서는 Finish를 눌러 그대로 진행합시다.
Project가 생성된 모습은 위의 그림과 같습니다. 이전 Post에서 언급한 configure.ac, Makefile.am 등이 생성되어 있는 것을 볼 수 있습니다.
GNU Autotools가 적용된 Project는 Build System을 자동으로 생성하기 위한 File들 외에 다음과 같은 Text File들이 기본적으로 포함되어 있어야 합니다.
- AUTHORS : Project 개발에 참여한 사람들의 이름을 적습니다.
- ChangeLog : Project의 각 Version Release에 대한 변경사항을 적습니다.
- COPYING : Project License를 적습니다. License 원문이 대부분 여기에 위치합니다.
- NEWS : Project와 관련된 소식을 여기에 적습니다.
- README : Project에 대해서 사용자에게 알려야 할 기본적인 사항을 여기에 적습니다.
그림에서 방금 언급한 Text File들이 자동으로 추가된 것을 확인할 수 있습니다. (세부적인 내용은 본인이 직접 작성해야 합니다.) 그리고 생성 시에 입력한 Source Directory에 Main Source File(예제에서는 hello.c)이 위치한 것을 볼 수 있습니다.
하지만, Autotools에 관련된 설정이 Project에 제대로 적용되지 않았기 때문에 지금 상태에서는 Build도 제대로 수행되지 않을 것입니다. 설정을 위해서 Project -> Properties를 Click합니다.
Project Properties에서 Autotools -> General을 선택한 다음, Tools Settings Tab에서 위의 그림과 같이 입력하여 해당 Program의 경로(/usr/bin)를 추가하고 OK를 누릅니다.
그 다음, Project Explorer에서 src/Makefile.am을 Double-Click하여 엽니다. 이전에도 설명했지만 Makefile.am은 Makefile을 자동으로 생성하기 위해 필요한 File들을 만들어 주는 Automake를 위해서 필요한 File입니다.
src/Makefile.am을 열어보면 위와 같은 내용을 하고 있을 것입니다. 2가지의 Macro가 표시되어 있는데 각각은 다음과 같은 의미가 있습니다.
- bin_PROGRAMS : 최종 결과물(Binary)의 이름을 입력합니다. Default로 위의 그림과 같이 a.out이 설정되는데 원하는 이름으로 바꾸면 됩니다.
- a_out_SOURCES : 최종 결과물을 Build하기 위해서 Compile해야 할 Source를 적습니다. 주의해야 할 것은 위에서 최종 결과물의 이름을 바꾸었다면 _SOURCES 앞을 그 이름으로 변경시켜줘야 한다는 것입니다.
최종 결과물이 a.out으로 나오는 것은 너무 옛날 방식이니 이름을 바꿔보도록 합시다. 위의 예제에서의 Project 이름이 hello이니 최종 결과물의 이름도 동일하게 바뀌도록 다음과 같이 Makefile.am을 수정합니다.
1 2 | bin_PROGRAMS=hello hello_SOURCES=hello.c |
src/Makefile.am을 저장한 다음, 이제 Build를 수행해 봅시다. Project -> Build Project를 Click합니다.
설정이 제대로 되었다면 위의 그림과 같이 Build가 완료되면서 여러가지 File이 생성될 것입니다. 여기서 생성된 File들은 Build를 명령을 통해서 내부적으로 Automake, Autoconf가 실행되면서 생긴 File들입니다.
그리고 생성된 Build System을 사용해서 configure Script와 make를 실행하여 Build가 완료되면 최종 결과물이 생성됩니다. 그림에서 보면 src/Makefile.am에 지정한 hello라는 최종 결과물(Binary)가 생성된 것을 Project Explorer를 통해 확인할 수 있습니다.
이제 생성된 최종 결과물을 실행해 봅시다. Run -> Run을 Click합니다.
처음 Run이나 Debug를 실행하게 되면 위의 그림과 같은 Dialog가 표시됩니다. 이 Dialog에서는 Debugging을 위한 Debugger를 선택할 수 있습니다. Remote Debugging을 사용하지 않기 때문에 gdb/mi를 선택하고 OK를 누릅니다.
정상적으로 실행되었다면, 위의 그림과 같이 아래의 Console View에 Hello World가 출력될 것입니다.
6. Source 추가하기
Eclipse CDT를 통해 생성한 다른 C/C++ Project와는 다르게 Autotools를 사용한 Project에서는 새로운 Source를 추가하더라도 Build에 자동으로 포함되지 않습니다.
지금부터 Source를 직접 추가해보면서 새로 생성한 Source File을 Build에 포함하는 방법을 알아봅시다.
Main Source File(위의 예에서는 hello.c)을 열어보면 위와 같은 내용일 것입니다. 위에서 Hello World를 출력하는 Code를 변경해서 새로 추가한 Source에서 Hello World를 출력하도록 만들어 보겠습니다.
새로 정의할 Function의 Prototype을 Include해서 사용할 수 있도록 먼저 Header File을 새로 만들어 봅시다. File -> New -> Header File을 Click합니다.
New Header File Dialog에서는 Header File을 생성하기 위한 기본적인 정보를 입력합니다.
기본적으로 Source Folder에는 Project를 생성 시에 지정한 Source Directory가 기본적으로 입력되어 있으며, Template은 C의 기본적인 Header의 내용이 입력된 Template이 설정되어 있습니다.
Header File에 새로 생성할 Header File의 이름(위의 예에서는 hello1.h)을 적고 Finish를 누릅니다.
새로 생성된 Header File의 모습입니다. 중복으로 이 File을 Include했을 경우를 위해서 Header File의 이름을 Symbol로 Define한 것을 할 수 있습니다.
이제 여기에 새로 생성할 Hello, World 출력 함수를 위해서 #define과 #endif 사이에 다음과 같이 입력하고 저장합니다.
1 2 3 4 | #include <stdio.h> /* Say hello */ extern void say_hello(char *); |
Hello World를 출력할 함수의 Prototype을 Header에 정의했으니 이제 이 함수를 구현할 Source File을 만들어 봅시다. File -> New -> Source File을 Click합니다.
New Source File Dialog에서는 Source File을 생성하기 위한 기본적인 내용을 입력합니다.
Source Folder는 Project 생성 시에 설정한 Source Directory가 기본적으로 입력되어 있으며, Template은 C Source의 Template이 설정되어 있습니다.
Source File에 새로 생성할 Source File의 이름(위의 예에서는 hello1.c)를 입력하고 Finish를 누릅니다.
새로 생성된 Source File의 모습입니다. 주석으로 생성된 File의 이름과 작성자, 그리고 생성 날짜가 자동으로 입력된 것을 알 수 있습니다.
이제 이 Source에 Header에서 선언한 함수를 다음과 같이 구현해 봅시다.
1 2 3 4 5 6 7 8 9 |
새로운 추가한 Source에 원하는 Code를 구현했으니 Main Source File을 수정해 봅시다.
Main Source File(위의 예에서는 hello.c)에서 새로 생성한 Source의 함수(위의 예에서는 hello1.c의 say_hello())를 호출하여 Hello World를 출력하도록 수정하면 다음과 같습니다.
1 2 3 4 5 6 7 8 | #include <stdlib.h> #include "hello1.h" int main(void) { say_hello("Hello World"); return EXIT_SUCCESS; } |
이제 새로운 Source File을 추가해서 Hello World를 구현하는 과정은 모두 마쳤습니다. 하지만 이대로는 Build에 포함되지 않기 때문에 Build에 새로 추가한 Source를 추가해 봅시다.
위의 그림과 같이 src/Makefile.am을 열어서 _SOURCES에서 Main Source File(위에서는 hello.c) 뒤에 한 칸 띄어서 새로운 추가한 Source File(위에서는 hello1.c)을 적어줍니다.
src/Makefile.am을 수정하기만 하면 그 이후에 나머지 필요한 과정은 Build 시에 자동으로 실행됩니다. 이제 모든 준비가 끝났으니 Project -> Build Project를 Click합시다.
Build가 완료된 후, Run -> Run을 Click하여 Build된 Binary를 실행하면 위와 같이 동일하게 Console View에 Hello World가 출력되는 것을 확인할 수 있습니다.
7. Debugging
이번에는 Debugging에 대해서 한 번 살펴봅시다. 기존의 다른 Project와는 다르게 Autotools Project에서는 Breakpoint와 상관없이 Program Counter가 이러저리 왔다갔다 하면서 제대로 Debugging이 이루어지지 않습니다. 왜 그럴까요?
Build 시에 Console의 내용들을 살펴보면 답을 쉽게 찾을 수 있습니다. 위의 그림에 표시한 것과 같이 Compile과 Link 시에 Compiler(GCC)에 사용된 Option을 보면 -g -O2가 적용되어 있는 것을 확인할 수 있습니다.
-g는 Debugging을 가능하게 Compile하는 Option, -O2는 Code를 Optimizing하는 Option입니다. 두 개를 동시에 쓰게 되면 Debugging을 위한 Data가 제대로 생성되지 않아서 Debugging를 제대로 할 수 없게 됩니다. (-O2로 인해 -g가 상쇄되는 효과)
Compile 시에 -g -O2 Option이 들어가는 것은 Shell의 환경변수인 CFLAGS와 관계되어 있습니다. CFLAGS는 C Source File을 Compile할 때 Compiler에 설정하는 Option을 지정하는 Shell 환경변수입니다. (C++의 경우는 CPPFLAGS)
기본적으로 사용자가 CFLAGS를 지정하지 않을 경우 configure Script에서는 Code Optimizing을 위해서 -g -O2를 사용하도록 되어 있습니다. 그러나 이 설정으로는 Debugging이 불가능하니 CFLAGS를 새로 지정하여 configure Script를 실행해 주면 문제가 해결될 것입니다.
이것을 응용해서 Build Configuration(Project의 Properties를 묶어놓은 Group을 의미)을 생성해서 Debugging을 위한 설정을 따로 관리해 봅시다.
Build Configuration으로 관리하게 되면 MS의 Build System에서 Release와 Debug를 구분하는 것과 유사하게 Release Build와 Debugging을 위한 Build를 쉽게 구분하여 Build 할 수 있게 됩니다.
Debugging을 위한 Build Configuration을 생성하기 위해서 Project -> Build Configurations -> Manage를 Click합니다.
Manage Configurations Dialog에서 New를 누릅니다.
Create New Configuration Dialog에서 Name에는 새로 생성할 Configuration의 이름인 Debug를 입력합니다.
그리고 기본적으로 생성되어 있는 Configuration인 Build (GNU)을 토대로 변경하기 위해서 Copy settings from에서 Existing configuration을 선택한 다음 Build (GNU)를 선택하고 OK를 누릅니다.
그 다음 OK를 눌러 Manage Configuration Dialog를 닫은 후, Debug Configuration의 설정을 수정하기 위해서 Project -> Properties를 Click합니다.
Project Properties에서는 각각의 Build Configuration을 따로 설정할 수 있습니다. 위에서 configure Script 실행시 CFLAGS를 지정해 주면 된다고 언급했기 때문에 Autotools -> Configuration Settings를 통해 설정해 봅시다.
그 다음, Configuration Combobox에서 방금 생성한 Build Configuration인 Debug를 선택하고, 아래의 Treeview에서 configure를 선택합니다. 그리고 Command에 다음과 같이 입력하고 Apply를 Click합니다.
1 | CFLAGS="-g3 -O0" configure |
그리고 생성된 Debug Configuration의 설정으로는 Build 시에 Compile된 결과물을 저장하기 위한 Directory가 따로 생성됩니다.
하지만 굳이 구분할 필요는 없기 때문에 생성하지 않도록 변경하기 위해서 Build location을 수정합시다. (취향에 따라 다른 이름을 입력해서 사용해도 됩니다.)
Project Properties Dialog에서 C/C++ Build의 Configuration Combobox에서 Debug를 선택한 다음, Builder Settings Tab의 Build Location -> Build Directory를
1 | ${workspace_loc/hello}/build-Debug |
에서,
1 | ${workspace_loc/hello} |
로 변경합니다. (위의 내용은 hello Project의 예임)
Project Properties Dialog를 OK를 눌러 닫은 후에, 현재 지정된 Build Configuration을 변경하기 위해서 Project -> Build Configurations -> Set Active -> Debug를 Click합니다.
그리고 변경된 Build Configuration이 Project에 적용될 수 있도록 Project -> Reconfigure Project를 Click하여 configure Script를 다시 실행하도록 합시다.
이제 준비가 완료되었습니다. Project -> Build Project를 눌러 Build를 완료하면 위의 그림과 같이 Compile 시에 Compiler Option이 -g -O2에서 -g3 -O0로 변경된 것을 확인할 수 있습니다.
이제 Breakpoint를 설정해 봅시다. 위의 그림과 같이 Main Source File (위의 예에서는 hello.c)의 say_hello()를 호출하는 Line에 Breakpoint를 설정하기 위해서 Cursor를 위치하고 Run -> Toggle Breakpoint를 Click합니다.
그리고 Debugging을 위해서 Run -> Debug를 Click합니다.
Debug가 시작되면 위의 그림과 같이 Eclipse의 Perspective가 Debug로 변경되면서 설정한 Breakpoint에 Program Counter가 위치하는 것을 확인할 수 있습니다.
8. 마치면서…
지금까지 간단하게 Ubuntu에서 Eclipse를 사용해서 Autotools Project를 만드는 방법을 알아봤습니다.
아직은 Autotools Support Plugin 자체가 Incubation 단계라서 부족한 부분들이 보이지만, 이 Plugin을 사용하면 Eclipse를 통해서 조금은 편리하게 Autotools가 적용된 Project를 개발할 수 있는 것 같습니다.
Eclipse CDT에서 Autotools를 사용하는 방법에 대한 더 자세한 내용을 알기 원한다면 아래의 Link를 방문해 보기 바랍니다.
- Eclipse CDT Autotools Guide : http://wiki.eclipse.org/Linux_Tools_Project/Autotools/User_Guide
'Linux > Open tools' 카테고리의 다른 글
Eclipse 3.5 Galileo에서 Subclipse로 SVN 연동하기 (1) 설치, Checkout (0) | 2012.06.04 |
---|---|
Borland C++ Builder 6: Doxygen으로 Source Code 문서화하기 (Part 1) (0) | 2012.06.04 |
Ubuntu에서 Eclipse CDT를 사용하여 Autotools Project 만들기 (Part 1) (0) | 2012.06.04 |
리눅스 네트워크 (0) | 2012.05.31 |
리눅스 네트워크 모니터링 프로그램 (0) | 2012.05.31 |
RECENT COMMENT