extern 키워드
- 해당 식별자의 정의(심볼)가 현재 번역 단위 파일 바깥쪽에 있다고 링커에게 알려줌
- 전역 함수, 변수는 기본적으로 extern 키워드가 붙었다고 간주됨
static 키워드
- 자신의 translation unit 안에서만 접근이 가능하게 만드는 키워드임
- internal linkage 방법으로 unnamed namespace를 더 권장하는 듯
extern "C" 키워드
- C++ 소스에서 선언한 전역변수나 함수를 C에서 사용해야 할 경우 사용함
- 이 키워드를 붙이면 네임 맹글링을 진행하지 않음
- C 인터페이스를 가진 심볼로 생성됨 (함수 오버로딩도 불가능해짐)
네임 맹글링(Name Mangling)
- C++에서 지원하는 함수 오버로딩을 구현하기 위해 사용되는 심볼 작명 방식임
- 컴파일 시 함수 이름을 고유하게 변경하여 같은 이름의 다른 함수들을 구분함
성능에 대한 오해
디버그 옵션
-g 옵션 : debug info가 포함됨-o 옵션 : optimization을 진행함라이브러리 유형
정의와 생성
ar -rs libcat.a cat.o (cat.h에 대한 라이브러리 생성 시)사용법
g++ main.cpp -lcat으로 사용하지만 이렇게 하면 libcat.a파일이 표준 라이브러리 경로에 없어서 에러 발생함-L 옵션을 붙여야 함 (특정 위치에서 libcat.a파일을 찾아서 적용)-L.이면 현재 디렉토리 위치를 의미함바인딩 타이밍
Load Time Dynamic Library 생성
g++ foo.cpp -fPIC -c
g++ -shared foo.o -o libfoo.so
-fPIC 옵션의 필요성
Run Time Dynamic Library 사용
런타임에 동적으로 라이브러리를 로드하고 함수를 호출하는 코드를 작성할 수 있음. 이를 위해서는 <dlfcn.h> 헤더를 포함하고 dlopen, dlsym, dlclose 함수들을 사용하여 라이브러리를 동적으로 관리할 수 있음
#include <dlfcn.h>
int main()
{
void* handle = dlopen("./libfoo.so", RTLD_LAZY);
if(!handle)
{
//handle 없음 출력
}
void (*fooPtr)();
fooPtr = (void(*)())dlsym(handle,"_Z3foov");
(*fooPtr)();
dlclose(handle);
return 0;
}
코드없는 프로그래밍
[C/C++] extern, static