일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 도커 #docker #docker-compose.yml #도커컴포즈 #배포 #spring #mysql #docker-compose
- /
- 도커 #Docker #배포 #Spring #MySQL #백엔드배포
- chatgpt #gpt #챗지피티 #ai
- Today
- Total
개발자 데뷔!
Linux 빌드시스템 본문
컴파일러 설치
C언어 컴파일러 : gcc(GNU Compiler Collection)
gcc 설치 버전 확인
// gcc 컴파일러 설치/버전 확인
gcc -dumpversion
설치 시 )
빌드 기본 패키지 설치
// 개발 패키지 설치 _ gcc, libc6-dev 등...
sudo apt-get install build-essential
소스코드 작성 & 빌드
아래와 같은 과정으로 소스코드 리눅스 시스템 내에서 빌드할 수 있다.
(vi) 코드작성 -> (gcc) 빌드 -> (./) 실행
// 소스코드 파일 생성&작성
vi hello.c
// .. 소스코드 내용 작성 후 저장(c파일) ...
// 소스코드 빌드
gcc hello.c
// 생성된 실행파일명 확인
ls
// 실행파일 실행
./a.out
위에서 실행되는 hello.c 소스코드는 아래와 같이 작성했다.
#include <stdio.h>
int main(int argc, char *argv[]){
printf("Hello, World!\n");
return 0;
}
빌드 옵션
옵션 | 기능 | 사용 | 예시 |
-o | 만들어질 실행파일 이름 지정 | gcc -o {실행파일명} {소스코드파일명} | gcc -o hello hello.c |
-Wall | (버그) 빌드 시 경고 옵션 전부 활성화 - 인자수 / 타입 오기입 경고 |
gcc -Wall {소스코드파일명} | gcc -Wall hello.c |
-O1 -O2 -O3 |
(버그) 빌드 시 최적화(optimization) - 뒤에 붙은 숫자 클수록 강력한 최적화 - O3 는 컴파일러에 의한 버그 가능성 多 - O2 를 일반적으로 사용 |
gcc -O1 {소스코드파일명} | gcc -O1 hello.c |
* 최적화 : 실행속도를 가능한 범위 내에서 향상시켜줌
* 실행파일 : .out 등 확장자 없이도 실행파일명으로 지정 가능
버그 & 디버거
: 리눅스에서 개발할 때 gdb(GNU Debugger) 가 많이 사용됨
- 세그멘테이션 폴트 (Segmentation fault)
- NULL 포인터를 참조하는 경우
- 배열의 범위를 넘어서 접근하는 경우
- 리눅스에서 해당에러가 발생하면 강제종료
실행인자
// echo 명령어 + x y z는 실행 인자
echo x y z
...
int main(int argc, char *argv[]) {
...
- argc : 실행인자의 개수
- argv : 실행인자의 내용을 문자열 배열 형태로 담고 있는 것. (char 포인터 타입)
다음과 같이 실행명령어를 치면 아래와 같이 입력된다.
{실행명령어} {실행인자1} {실행인자2} ...
./hello x y z
argv[0] -> ./hello\0 |
argv[1] -> x\0 |
argv[2] -> y\0 |
argv[3] -> z\0 |
argv[0] 에는 프로그램 실행 시 입력한 명령어 자체가 들어간다.
그 이후 argv[1] ~ 에는 실행인자가 들어간다.
즉, argc 는 항상 1 이상이다.
아래와 같이 실행인자를 모두 출력하는 args.c 파일 작성 후 실행해보자.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int i;
printf("argc=%d\n", argc);
for(int i=0; i<argc; i++){
printf("argv[%d]=%s\n", i, argv[i]);
}
exit(0);
}
- 큰 따옴표(" ")로 묶으면 감싼 부분을 하나의 실행 인자로 묶어준다. => 셸(shell)의 기능
- 와일드 카드(glob 패턴 -ex_ '*', '?')을 사용하면, 파일 이름의 집합을 표현 할 수 있다.
- 파일 이름의 집합은 셸(shell)이 개별인자로 바꾸어 준다.
함수 정보 얻기
리눅스에서 c 프로그래밍을 할 때, 셸 명령어로 함수에 대한 정보를 간단히 얻을 수 있다.
크게 man 명령어, info 명령어가 있다.
man 명령어
: 특정 함수의 스펙을 조사할 때 쓰는 명령어
man {알아볼 함수명}
man {참고할 페이지 number} {알아볼 함수명}
사용예시)
man strlen
man printf
man 3 printf
man 페이지는 내용에 따라 여러 섹션으로 구분되어 있다.
- 섹션 1부터 차례로 조사해, 가장 먼저 발견한 섹션 페이지를 표시해준다.
- 여러 섹션에 동일한 이름의 페이지가 존재할 수도 있다.
섹션 | 분류 |
1 | 실행 가능한 프로그램&셸 명령어 |
2 | 시스템 콜 |
3 | 라이브러리 함수 |
4 | 특별한 파일(디바이스 파일) 등 |
5 | 파일 포맷 |
6 | 게임 |
7 | 규격 등 |
8 | 시스템 관리용 명령어 |
strlen()함수의 정보를 알아보면 아래와 같이 해당 함수에 대한 설명이 나온다
사용법 및, 포함된 헤더파일명, 타입도 상세히 나와 유용하게 쓸 수 있다.
strlen의 경우 페이지 섹션3 에서 찾아 STRLEN(3)과 같이 표시된다.
info 명령어
: GNU가 만든 문서시스템
GNU libc 는 man보다 info를 먼저 참조해야 한다.
'DevOps > Linux' 카테고리의 다른 글
[Linux] 리눅스 커널 기본 (0) | 2024.05.05 |
---|---|
[리눅스] Linux설치3 _ VM에 ubuntu 설치 (0) | 2021.10.31 |
[리눅스] Linux설치2 _ Virtual Box 가상환경 설치 (0) | 2021.10.31 |
[리눅스] Linux설치1 _ Ubuntu 다운로드 (0) | 2021.10.28 |
[리눅스] Linux 배경 (0) | 2021.10.27 |