c++ 컴파일러 질문입니다. (공유 라이브러리 만들때)

poplinux의 이미지

소스는 C 로 구현되어 있지만 C++ 로 컴파일해야 합니다. 기존에 C 로 컴파일해서는 잘 사용했습니다.

run.c : config.c 에서 실제 함수와 대표 함수를 연결해 놓았으면 그 대표 함수를 호출하여 실제 함수를 사용함.
config.c : function.c 에 실제 구현되어 있는 함수를 함수 포인터로 연결해 주는 소스
function.c : 실제 함수가 구현되어 있는 소스

이렇게 되어 있는 상태에서 각각 소스를 공유 라이브러리 오브젝트 즉 -fPIC -c -g -o ... 이런식으로 컴파일 한 다음 -shared -Wl,-soname,libtest.so -o libtest.so *.o 이런식으로 만들경우

cc 로 컴파일 할 경우엔 문제가 없는데 c++ 로 컴파일하게 되면 run.c 와 config.c 와 function.c 에서 multi define 했다는 에러가 발생합니다.

nm 으로 C++ 로 컴파일 했을 때와 C 로 컴파일했을 때 오브젝트를 서로 비교해 보니까

C++ 로 컴파일할 경우, 충돌나는 함수명이 run() 이라고 할 때
run.o :
00000024 B fun

config.o :
0000004c B fun

function.o :
00000056 B fun

이런식으로 나옵니다. 이런식으로 나오면 오브젝트를 합치 때 문제가 발생하는 것은 당연한 것으로 보입니다.

반면 C 로 컴파일하면

run.o :
00000024 C fun

config.o :
0000004c C fun

function.o :
00000056 T fun

로 컴파일됩니다. 컴파일 되는 게 정상이지요.

같은 소스인데 컴파일러에 따라서 이렇게 바뀌는 문제를 해결하려면 어떻게 해야 할까요?

kghoon의 이미지

맹글링 문제로 보입니다..(확실한건 잘... 코드가 없어서....)
만약 맞다면..

#ifdef __cplusplus
extern "C"{
#endif

...
..
..
..

#ifdef __cpluspluse
}
#endif

Engineer at Alticast