2012-01-20 4 views
1

어떻게 C++로 작성했는지 묻겠습니다.하지만이 아이디어는 여러 언어에 적용될 수 있습니다. 당신은뿐만 아니라 목표 - C에서 작업을 수행하는 방법을 알고 있다면, 내가라이브러리 클래스의 인스턴스화 방법

ofstream myfile; 

나는 모든 I 있으리라 믿고있어 같은 ofstream의 인스턴스를 생성하고 싶은 말은 할 수있는 두 개의

사이의 유사성을 제공하십시오 내 컴퓨터에 * .o 파일 (라이브러리 아카이브에 있음) 및 iostream 클래스 용 * .h 파일이 있어야합니다. 이 부분이 사실이 아니라면 알려주십시오. 나는 내가 설치 한 모든 것이 런타임과 소스 패키지가 아니라 소스 파일 일 때 이것을 가정하고있다.

헤더 파일을 오브젝트 파일에 연결하는 방법에는 명명 체계가 있습니까? 그리고 그것은 어떤 순서로 보입니까?

왜 내가 클래스를 만들고 싶을 때 혼란 스럽습니까? 프로그램과 클래스의 구현을 연결합니다. 그렇다면 지금은 어디에서 파일을 어떻게 링크합니까?

정적으로 또는 동적으로로드하는 경우 하나 더 중요합니까?

감사합니다. 바보 같은 질문이 있으면 미리 알려주세요.

+0

http://stackoverflow.com/questions/6528071/how-does-linkage-and-name-mangling-work –

+0

http://stackoverflow.com/questions/2937273/questions-about-name-mangling-in-c –

+0

http://en.wikipedia.org/wiki/Name_binding http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora065.html –

답변

2

컴퓨터 과학 101 :

  1. 이 광범위하게 (매우 광범위하게!) 말하고, "프로그램"의 두 종류가 있습니다 :

    A) 해석 :이 프로그램의 소스 라인 별 읽기 컴파일) 때마다 당신은 그것을 < = * 괜찬아 쉘 스크립트를 실행하고 DOS의 .bat 파일은

    B "interpeted"위치 : 소스를 읽을 번 (는 "이진 기계 코드"로 변환) . 기계 코드 "오브젝트 파일"을 링크하여 "실행 가능 프로그램"을 빌드하십시오. 당신은 "컴파일 된 프로그램"

  2. 프로그램이

    는 "ofstream"에 대한 바이너리 구현은 직접 컴파일 할 수있다 "컴파일"일단은 "ofstream"부분은 무관에 대해 얘기하고

  3. 실행 가능 파일이거나 런타임시 공유 라이브러리 (.dll)에서 동적으로로드 될 수 있습니다.

  4. 원본 파일을 처리하기위한 "컴파일러"사용자 ".h"헤더.

    "링커"는 기호를 일치시키고 링크 유형에서 정적 코드를 링크하는 데 ".lib"라이브러리를 사용합니다.

    "운영 체제"는 동적 링크를 인식하고 런타임에 필요한 공유 라이브러리 (.dll)를로드합니다.

세 가지 다른 일들이, 서로의 모든 독립적 인 .. 조금 도움이 컴파일러/소스 코드, 링커/기계 오브젝트 코드, OS/실행 프로그램

'희망 ...

+1

추신 : 귀하의 질문은 "운영 체제가 실행중인 프로그램에 필요한 공유 라이브러리를 어떻게 파악하는지, 어디에서 찾을 수 있습니까?" - 여기보세요 : http://en.wikipedia.org/wiki/Library_%28computing%29 – paulsm4

+0

그 링크는 매우 유용했습니다. 한 가지 더 많은 질문이 있습니다. 공유 라이브러리의 객체가 정적으로 링크되어있을 때 전체가 라이브러리 코드가 포함되거나 코드를 실행하는 데 필요한 것이 있습니까? 동적으로 링크 된 경우에도 동일합니까? – rubixibuc

+0

"정적 연결"은 ".exe에 포함"을 의미합니다. "동적 연결"이란 * .exe 파일에 넣지 말고 런타임에 가져 오는 것을 의미합니다. 동적 연결의 이점에는 1) 작음이 포함됩니다.exe, 2) 새로운 .exe가 필요없는 모듈 *을 업데이트/변경하는 기능. 예 : 정적으로 링크하면 포함됩니다. 당신이 동적으로 연결할 때, 그것은 * 포함되지 않습니다. .exe 그냥 "참조"만들고 런타임까지 실제로 포함되어 있지 않습니다. 그리고 실제로는 필요한 경우에만 "포함"됩니다. – paulsm4

0

정적 링크를 수행하면 .obj 파일에서 링크가있는 모든 심볼을 사용할 수 있습니다. 링커는 함수 호출을 함수의 진입 점에 바인드합니다. 심볼이 올바르게 해석 될 수 있도록이 프로세스와 관련된 이름이 있습니다.

동적 연결은 플랫폼에 종속 된 문제이며, 알고있는 한 C 또는 C++ 표준의 일부가 아닙니다.

+0

목표 -C와 비슷하게 수행됩니까? – rubixibuc

+0

죄송합니다. 객관적으로 어떻게 작동하는지 모르겠지만 매우 비슷할 것입니다. – frast

+0

모든 정적 및 동적 외부 기호는 컴파일러에서 오브젝트 파일에 지정합니다. 모든 외부 기호는 링커에 의해 지정됩니다 (실행 프로그램과 공유 라이브러리 모두에서!). 이러한 기호는 OS (적절한 .dll을로드하기 위해)와 외부 디버거에 필요합니다. – paulsm4

2

이것은 표준화되지 않았으며 구현에 달려 있습니다. 나는 유닉스에 대해 모른다. 그러나 나는 윈도우와 상당히 유사하다고 생각한다.

.o 개의 파일이 라이브러리 파일 .lib과 유사하다고 가정 할 수 있습니다.

헤더는 클래스 정의를 정의하므로 링커에서 라이브러리에서 찾을 항목을 알 수 있습니다.

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

과 LIB 파일 A.lib :

당신은 헤더가 말해.

A a; 
a.foo(); 

컴파일러는 봇 A()A::foo()에 대한 선언을 찾습니다

당신은 헤더와 전화를 포함한다. 이제는 라이브러리에서 이러한 함수를 검색해야한다는 것을 알고 있습니다. 라이브러리의 이름은 장식되어 있으며 한정자를 포함하지만 컴파일러에만 해당하므로 링커는 함수를 라이브러리에서 내 보낸 경우 해당 함수를 찾습니다. 그런 다음 함수를 dll에서 특정 진입 점에 바인딩합니다.

동적로드로 연결하는 대신 LoadModule()GetProcAddress()을 사용하는 경우 개념이 매우 유사합니다.

+0

* nix : * .o 파일은 DOS/Windows * .obj와 유사합니다. * .a 파일은 * .lib와 유사하며 * .so 파일은 * .dll과 유사합니다. – paulsm4

관련 문제