동적 링크 작동 방식, 사용법 및 dylib를 만드는 방법과 이유

궁금한 :

스택 오버플로에 대한 여러 게시물을 읽고 온라인에서 동적 링크에 대해 읽었습니다. 그리고 이것이 제가 그 모든 독서에서 빼낸 것입니다-

동적 연결은 시스템의 가상 메모리를 최대한 활용하기 위해 사용 된 최적화 기술입니다. 한 프로세스는 페이지를 다른 프로세스와 공유 할 수 있습니다. 예를 들어 libc++모든 C ++ 프로그램과 연결해야하지만 실행 파일을 모든 프로세스에 복사하는 대신 공유 가상 페이지를 통해 여러 프로세스와 동적으로 연결할 수 있습니다.

그러나 이것은 다음 질문으로 이어집니다.

  1. C ++ 프로그램이 컴파일 될 때 C ++ 라이브러리 함수 및 코드 (예 : 스레드 라이브러리의 코드)에 대한 참조가 있어야합니다. 컴파일러는 어떻게 실행 파일에 이러한 참조를 갖습니까? 컴파일러와 운영 체제간에 순환 종속성이 발생하지 않습니까? 컴파일러는 실행 파일에서 동적 라이브러리를 참조해야하기 때문입니다.
  2. 동적 라이브러리를 언제 어떻게 사용 하시겠습니까? 어떻게 만드나요? 표준 *.cpp파일 에서 이러한 파일을 생성하는 데 사용되는 특정 컴파일 명령은 무엇입니까 ?
  3. 일반적으로 라이브러리를 설치할 때 파일과 (mac-OSX에) 파일 이있는 lib/디렉토리가 있습니다. 일반 파일에서와 같이 정적으로 링크 할 파일과 동적으로 링크 할 파일을 어떻게 알 수 있습니까? 파일이 동적 라이브러리 라고 가정합니다 . 어떤 컴파일러 플래그를 이들 링크에 사용합니까?*.a*.dylib*.o*.dylib
  4. 무엇 -L-l플래그를 위해? 예를 들어 -lusb명령 줄에 플래그 를 지정한다는 것은 무엇을 의미 합니까?

이 질문이 한 번에 너무 많은 것을 요구하는 것 같으면 알려주십시오. 이 질문을 여러 질문으로 나누면 완전히 괜찮을 것입니다. 한 질문에 대한 답이 다른 질문으로 이어지는 것처럼 느끼기 때문에 함께 질문합니다.

해리 :

C ++ 프로그램이 컴파일 될 때 C ++ 라이브러리 함수 및 코드 (예 : 라이브러리 코드)에 대한 참조가 있어야합니다.

가상 공유 라이브러리가 있다고 가정합니다 libdyno.so. 당신은 결국 사용하여 그 안에 들여다 할 수 있습니다 objdump또는 nm.

objdump --syms libdyno.so

공유 라이브러리가있는 시스템에서 오늘이 작업을 수행 할 수 있습니다. objdumpMAC gobjdump에서는 binutils패키지에 brew가 포함되어 있습니다. Mac에서 이것을 시도하십시오 ...

gobjdump --syms /usr/lib/libz.dylib

이제 심볼이 공유 객체에 포함되어 있음을 알 수 있습니다. 때를 link공유 객체는 일반적으로 같은 것을 사용

g++ -Wall -g -pedantic -ldyno DynoLib_main.cpp -o dyno_main

-ldyno해당 명령에 유의하십시오 . 이것은 컴파일러 (실제로 링커 ld)에게 libdyno.so일반적으로 찾는 위치 라는 공유 객체 파일을 찾도록 지시 합니다. 해당 객체를 찾으면 필요한 기호를 찾을 수 있습니다. 개발자가 -l플래그 를 지정하여 동적 라이브러리를로드하도록 요청했기 때문에 순환 종속성이 없습니다 .

동적 라이브러리를 언제 어떻게 사용 하시겠습니까? 어떻게 만드나요? 표준 .cpp 파일에서 이러한 파일을 생성하는 데 사용되는 특정 컴파일 명령은 무엇입니까

DynoLib.cpp라는 파일을 만듭니다

#include "DynoLib.h"
DynamicLib::DynamicLib() {}
int DynamicLib::square(int a) {
  return a * a;
}

발신자 DynoLib.h 파일 만들기

#ifndef DYNOLIB_H
#define DYNOLIB_H
class DynamicLib {
  public:
  DynamicLib();
  int square(int a); 
};
#endif

다음과 같이 공유 라이브러리가되도록 컴파일하십시오. 이것은 리눅스 전용입니다 ...

g++ -Wall -g -pedantic -shared -std=c++11 DynoLib.cpp -o libdyno.so

이전에 제공 한 명령을 사용하여이 객체를 검사 할 수 있습니다.

objdump --syms libdyno.so

이제 DynoLib_main.cpp라는 파일을 만듭니다

#include "DynoLib.h"    
#include <iostream>     
using namespace std;
int main(void) {
DynamicLib *lib = new DynamicLib();
  std::cout << "Square " << lib->square(1729) << std::endl;
  return 1;
}

다음과 같이 컴파일하십시오

g++ -Wall -g -pedantic -L. -ldyno DynoLib_main.cpp -o dyno_main
./dyno_main
Square 2989441

를 사용하여 주 바이너리를 살펴볼 수도 있습니다 nm. 다음에서는 문자열 square무언가가 있는지 확인 합니다. 즉, libdyno.so바이너리에서 참조하는 방식에서 필요한 기호 입니다.

nm dyno_runner |grep square
U _ZN10DynamicLib6squareEi

대답은 '예'입니다. 대문자 U는 정의되지 않았지만 이는 앞에서 만든 DynamicLib 클래스에서 사각형 메서드의 심볼 이름입니다. 이상한 이름은 이름 자체가 주제이기 때문에 맹 글링하기 때문입니다.

일반 .o 파일에서와 같이 정적으로 링크 할 파일과 동적으로 링크 할 파일을 어떻게 알 수 있습니까?

당신은 알 필요가 없습니다. 연결할 대상을 지정하고 컴파일러 (및 링커 등)가 작업을 수행하도록합니다. 노트 -l플래그 이름을 라이브러리를하고는 -L어디 있는지 방법을 알려줍니다. 컴파일러가 여기서 물건을 찾는 방법에 대한 적절한 글이 있습니다.

gcc 연결 옵션 -L : 동적 라이브러리의 경로를 지정하는 다른 방법

또는을보십시오 man ld.

-L 및 -l 플래그는 무엇입니까? 명령 행에 예를 들어 -lusb 플래그를 지정한다는 것은 무엇을 의미합니까?

위의 링크를 참조하십시오. 이건 man ld..

-L searchdir

ld가 아카이브 라이브러리 및 ld 제어 스크립트를 검색 할 경로 목록에 search search 경로를 추가하십시오. 이 옵션은 여러 번 사용할 수 있습니다. 디렉토리는 명령 행에 지정된 순서대로 검색됩니다. 명령 행에 지정된 디렉토리는 기본 디렉토리보다 먼저 검색됩니다. 모든 -L 옵션은 옵션이 나타나는 순서에 관계없이 모든 -l 옵션에 적용됩니다. -L 옵션은 -T 옵션을 지정하지 않으면 ld가 링커 스크립트를 검색하는 방법에 영향을 미치지 않습니다 .`

여기에 가면 링커, 즉 ld에 대해 배우기 위해 배당금을 지불합니다. 그것은 중요한 일을하고 대부분의 사람들이 컴파일러를 다루기 시작하고 그것을 생각하기 때문에 많은 혼란의 원천 compiler == linker이며 이것은 사실이 아닙니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

JOptionPane이 작동하는 방식과 유사하게 JFrame 일시 중지 스레드를 만드는 방법

Threadpool이 스레드를 재사용하는 방법과 작동 방식

데이터 목록에서 동적 하이퍼 링크를 만드는 방법

gridview에 동적으로 링크를 제공하는 방법 및 클릭시 코드를 작성하는 방법

ASP.NET Core에서 이메일에 동적 링크를 만드는 방법

Django에서 동적 링크를 만드는 방법

특정 날짜로 동적 링크를 만드는 방법

목록 변수간에 동적 링크를 만드는 방법

동적 링크 가져 오기 JavaScript를 만드는 방법

Admin SDK에서 Firebase 동적 링크를 만드는 방법

REST API로 Firebase 동적 링크를 만드는 방법

식을 사용하여 Where 및 OR로 동적 쿼리를 작성하는 방법

동적 링크만 사용할 때 Firebase 데이터베이스 비활성화를 방지하는 방법

AJAX를 사용하여 도메인 간 요청을 만드는 방법과 작동 이유

동적 테이블과 함께 스핑크스를 사용하는 방법

방법으로 동적 라우터 링크를 사용하는 방법

프로그래밍 방식 (iOS)으로 Firebase 동적 링크를 만드는 방법은 무엇입니까?

JavaScript를 사용하여 동적 콘텐츠 간의 링크를 만드는 방법은 무엇입니까?

각 거북이가 링크 이웃과 동일한 링크를 공유하도록하는 방법

qtextbrowser에 하이퍼 링크 및 사용자 클릭 가능 동작을 추가하는 방법

centos의 bash 스크립트에서 자동 사용자 이름 및 비밀번호를 만드는 방법

도메인 이름을 잡는 동적 링크를 만드는 방법은 무엇입니까?

pydantic 및 dict 데이터 유형을 사용하여 동적 모델을 만드는 방법

PC에서 작동하는 상대 심볼릭 링크를 만드는 방법

Excel에서 동적 하이퍼링크를 만드는 방법은 무엇입니까?

객체 (Node.js && 핸들 바)에 주어진 데이터로 동적 a href 링크를 만드는 방법

플라스크를 사용하여 양식에서 동적 URL을 만드는 방법

두 노드 (gojs) 사이에 링크를 만드는 동안 노드 강조 모양을 변경하는 방법

모달을 사용하여 Python Flask 및 HTML로 데이터를 동적으로 렌더링하는 방법

TOP 리스트

뜨겁다태그

보관