동적 링크 작동 방식, 사용법 및 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리뷰
로그인참여 후 검토

관련 기사

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

TOP 리스트

  1. 1

    셀레늄의 모델 대화 상자에서 텍스트를 추출하는 방법은 무엇입니까?

  2. 2

    Webpack 4가 분할 모듈로 취급하는 원시 JSON 파일을 배포하는 방법은 무엇입니까?

  3. 3

    Windows에서 Apache Kafka 오류-주 클래스 QuorumPeerMain을 찾거나로드 할 수 없습니다.

  4. 4

    Zookeeper Cluster를 시작합니다. 오류 : 주 클래스 org.apache.zookeeper.server.quorum.QuorumPeerMain을 찾거나로드 할 수 없습니다.

  5. 5

    어떻게 reslove: InvalidArgumentError: 그래프 실행 오류가 발생합니까?

  6. 6

    PyCharm에서 프로젝트를 제거하는 방법은 무엇입니까?

  7. 7

    Python : 특정 범위를 초과하면 플롯의 선 색상을 변경할 수 있습니까?

  8. 8

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

  9. 9

    화살표와 테두리가있는 CSS 전용 툴팁

  10. 10

    웹 사이트 로딩 속도를 높이는 방법을 알려주세요.

  11. 11

    응답에 대한 JMESPath 필터링

  12. 12

    D3 JS에서 하프 도넛 원형 차트 값 표시

  13. 13

    Joomla 3의 단일 기사에서 소셜 미디어 아이콘을 게시 취소하는 방법은 무엇입니까?

  14. 14

    scipy.misc 이미지 함수의 AttributeError, ImportError (예 : imread, imresize, imsave, imshow 등)

  15. 15

    Xcode 6 Beta 4 Broke stringWithContentsOfURL : encoding : error :

  16. 16

    Java에서 HSSFCell의 최대 길이 늘리기

  17. 17

    Mac에서 python import nltk 오류

  18. 18

    오류 CS0019 : '<'연산자를 'string'및 'int'유형의 피연산자에 적용 할 수 없습니다.

  19. 19

    Libavformat은 RTP 스트림을 너무 빠르게 기록합니다(너무 높은 FPS).

  20. 20

    Linux 시스템에 대해 OPEN_MAX는 어디에 정의되어 있습니까?

  21. 21

    스프링 부트에서 application.properties 값을 동적으로 변경

뜨겁다태그

보관