2013-08-23 2 views
3

나는 다음과 같은 C++ 프로그램이 있습니다C++ 정적 라이브러리를 C 프로그램에 어떻게 연결합니까?

:

Client.h

#ifndef Client_Client_h 
#define Client_Client_h 

#include "Client.h" 

class Client { 

public: 
    void f1(); 
    void f2(); 
}; 

#endif 

Client.cpp

#include <iostream> 
#include <stdlib.h> 
using namespace std; 

#include "Client.h" 

void Client::f1(){ 
    cout << "Client.f1()" << endl; 
} 

void Client::f2() { 
    cout << "Client.f2()" << endl; 
} 

엑스 코드 4.3 위를 컴파일 내게라는 정적 라이브러리 파일을 제공합니다

libClient.a 

별도로 메인 C가 있습니다

#include <stdio.h> 
// 
//using namespace std; 

int main(){ 
     // how do I do something like: Client c; c.f1(); c.f2(); 
     // and actually get output ? 
     printf("hello\n"); 
     return 0; 
} 

f1() 및 f2()를 호출하기 위해 수행해야 할 단계는 무엇입니까? GCC를 사용하여 정적 라이브러리를 올바르게 연결하려면 어떻게해야합니까?

은 지금까지 나는 시도했다 :

gcc -lClient.a main.c 

것은 나에게주는이 작동하는 것, 또는되지

ld: library not found for -lClient.a 
collect2: ld returned 1 exit status 
+0

대상 프로그램이 C++이되어야 할 수도 있습니다. –

+0

C 프로그램에서 C++ 기능을 호출하는 영리한 방법이 없습니까? – user1068636

+1

라이브러리 내부의 함수로 래핑 할 수 있습니다. 'extern "C"void invoke_f1();'그리고 그것을 내 보냅니다. – Anthony

답변

8

적어도 휴대용 될 수 없습니다. 하나의 정말 정말 할 분명한 일은 프로그램을 C++로 만들어 이러한 기능에 액세스 할 수있게하는 것입니다.

분명히 C 코드에서 C++ 코드를 사용할 수는 없습니다. 객체 지향 기능에 액세스 할 수 없기 때문에 생성자, 소멸자, 이동/복사 의미 및 가상 상속과 같은 많은 것들이 작동하지 않습니다. (그렇습니다 : 사소한 생성자와 소멸자가없는 한 객체를 올바르게 작성하거나 파기 할 수 없습니다.)

또한 링크 문제가 발생합니다. C++ 함수 이름은 mangled이 포함되어 있습니다. 매개 변수 유형 및 반환 유형 및 클래스는 __1cGstrcpy6Fpcpkc_0_과 같습니다. 기술적으로 가능하다면을 사용하여 C에서 함수의 맹 글링 된 이름을 선언하거나, dlsym을 사용하여 포인터를 가져올 수 있습니다.하지만 이것은 바보입니다. 그러지 마. 당신이 C에서 호출 할 필요가 C++에 기능를 작성해야하는 경우

, 당신은 extern "C"로 지정할 수 있으며, 그 이름은 엉망이되지 않습니다, 그것은 C에서 액세스 할 수 있습니다, 그것은 것입니다 당신은 다음과 같은 프로그램의 C 측에 선언해야합니다

extern "C" void Foo() 
{ 
    std::string hello = "Hello world!"; 
    std::cout << hello << std::endl; 
} 

: 자체는 할 수 C++ 기능을 사용하는

void Foo(); 

을 그리고 당신은 그것을 호출 할 수 있습니다.

extern "C" 함수에서 C 프로그램에 공개하려는 모든 C++ 호출을 래핑하고 해당 유형에 대한 포인터를 반환하고 그런 식으로 처리 할 수는 있지만 매우 성가 시게됩니다. 정말로 C++ 만 사용해야합니다.

Xcode에서 프로젝트 설정으로 이동하여 대상을 선택하고 빌드 단계 탭으로 이동 한 다음 "라이브러리와 이진 파일 링크"섹션을 펼치고 .a 거기에 파일.

+1

올바른 방법입니다. 응용 프로그램을 C 및 라이브러리로 C++로 작성해야하는 경우 어떤 이유에서든 C가 이해할 수있는 라이브러리 인터페이스 코드로 랩핑해야합니다. – Anthony

관련 문제