스택 오버플로에 대한 여러 게시물을 읽고 온라인에서 동적 링크에 대해 읽었습니다. 그리고 이것이 제가 그 모든 독서에서 빼낸 것입니다-
동적 연결은 시스템의 가상 메모리를 최대한 활용하기 위해 사용 된 최적화 기술입니다. 한 프로세스는 페이지를 다른 프로세스와 공유 할 수 있습니다. 예를 들어 libc++
모든 C ++ 프로그램과 연결해야하지만 실행 파일을 모든 프로세스에 복사하는 대신 공유 가상 페이지를 통해 여러 프로세스와 동적으로 연결할 수 있습니다.
그러나 이것은 다음 질문으로 이어집니다.
*.cpp
파일 에서 이러한 파일을 생성하는 데 사용되는 특정 컴파일 명령은 무엇입니까 ?lib/
디렉토리가 있습니다. 일반 파일에서와 같이 정적으로 링크 할 파일과 동적으로 링크 할 파일을 어떻게 알 수 있습니까? 파일이 동적 라이브러리 라고 가정합니다 . 어떤 컴파일러 플래그를 이들 링크에 사용합니까?*.a
*.dylib
*.o
*.dylib
-L
과 -l
플래그를 위해? 예를 들어 -lusb
명령 줄에 플래그 를 지정한다는 것은 무엇을 의미 합니까?이 질문이 한 번에 너무 많은 것을 요구하는 것 같으면 알려주십시오. 이 질문을 여러 질문으로 나누면 완전히 괜찮을 것입니다. 한 질문에 대한 답이 다른 질문으로 이어지는 것처럼 느끼기 때문에 함께 질문합니다.
C ++ 프로그램이 컴파일 될 때 C ++ 라이브러리 함수 및 코드 (예 : 라이브러리 코드)에 대한 참조가 있어야합니다.
가상 공유 라이브러리가 있다고 가정합니다 libdyno.so
. 당신은 결국 사용하여 그 안에 들여다 할 수 있습니다 objdump
또는 nm
.
objdump --syms libdyno.so
공유 라이브러리가있는 시스템에서 오늘이 작업을 수행 할 수 있습니다. objdump
MAC 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] 삭제
몇 마디 만하겠습니다