c++ 컴파일러 질문입니다. (공유 라이브러리 만들때)
소스는 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
로 컴파일됩니다. 컴파일 되는 게 정상이지요.
같은 소스인데 컴파일러에 따라서 이렇게 바뀌는 문제를 해결하려면 어떻게 해야 할까요?
extern "C"
맹글링 문제로 보입니다..(확실한건 잘... 코드가 없어서....)
만약 맞다면..
#ifdef __cplusplus
extern "C"{
#endif
...
..
..
..
#ifdef __cpluspluse
}
#endif
Engineer at Alticast
댓글 달기