[질문] 라이브러리가 g++로 된 경우

leolo의 이미지

[질문] 라이브러리가 g++로 컴파일 된경우
이를 *.c 파일에서 컴파일 하여 사용하기 위한 방법이 있는지요.
라이브러리의 헤더 파일도 g++에 적합하도록 된거 같은데.

한가지 더 질문드립니다.
Makefile에서 -DLINUX의 의미가 무엇인가요?

kane의 이미지

C에서 C++를 사용하려면 C 형태로 감싸주어야 합니다.

class C
{
public:
  void foo() {}
};

C++ 라이브러리/오브젝트가 위와 같은 형태라고 가정하면
/* c_foo.h */
extern "C"
{
void c_foo();
}

/* c_foo.c */
#include "C.h"

void c_foo()
{
  C c;
  c.foo();
}

위와 같은 방식으로 C++ 코드를 C 코드로 감싸줍니다.
그리고 g++로 컴파일합니다.
#include "c_foo.h"

int main()
{
  c_foo();
}

이제 마지막으로 C코드에서 아까 감싼 함수를 사용하고 gcc로 컴파일합니다.

이게 정석인지는 모르겠지만 경험상 가능한 방법입니다.

doldori의 이미지

leolo wrote:
[질문] 라이브러리가 g++로 컴파일 된경우
이를 *.c 파일에서 컴파일 하여 사용하기 위한 방법이 있는지요.
라이브러리의 헤더 파일도 g++에 적합하도록 된거 같은데.

C++ 함수가 C linkage로 지정되지 않았다면 불가능합니다.
참고하세요.
http://www.research.att.com/~bs/bs_faq2.html#callCpp

leolo wrote:
Makefile에서 -DLINUX의 의미가 무엇인가요?

소스에서
#define LINUX
라고 써준 것과 동일한 효과입니다.
doldori의 이미지

kane wrote:
#include "c_foo.h"

int main()
{
  c_foo();
}

이제 마지막으로 C코드에서 아까 감싼 함수를 사용하고 gcc로 컴파일합니다.

이게 정석인지는 모르겠지만 경험상 가능한 방법입니다.


C++과 C 코드를 함께 쓸 때는 main()을 반드시 C++ 코드에 넣어야 합니다.
그렇지 않으면 non-local static object(global, namespace, class의 static
멤버)의 초기화를 보장할 수 없습니다.