2 min read

C/C++에서 공유 라이브러리 제작시 주의점

C/C++ 공유라이브러리 작업시 C++의 고유한 네이밍을 주의하기 위해 extern “c”을 하고 나면 다 끝나는줄 알았는데 그게 아니였다.

extern “C”은 C++ 작업자의 컴파일러에 따라 네이밍 규칙이 다른데 이를 C 형태로 제공하는 하나의 키워드다.

다음의 표를 통해 확인 할 수 있다.

https://en.wikipedia.org/wiki/Name_mangling

위에 표처럼 같은 함수인데도 컴파일러의 따라 이름이 변경이 된 걸 확인 할 수 있다.

이거 말고 공유 라이브러리 제작 시 중요한 건 메모리 구조이다. 아래의 헤더파일을 만들었다고 생각하자.

typedef struct AAA{
   std::string name;
   int a;
}

유저는 만든 헤더파일을 사용할 것이다.

하지만 std::string은 컴파일러의 libc++에 버전마다 스택 사이즈가 다르고 컴파일 옵션에 따라 (debug release) 다르다.

https://wandbox.org/

사진에 보듯이 컴파일러의 버전에 따라 std::string의 사이즈가 다르다 보니 유저가 해당 라이브러리를 사용시 스택영역이 깨지는 문제점이 발생할수 있다.

그래서 공유 헤더에는 C에서 제공하는 struct , primary type , pointer 만 사용해야 한다.

위와 비슷한 문제로 구조체 패딩에 대한 문제점이 있어 , 정의가 필요하다.