C++ 동적 링크 라이브러리(so 파일) 생성 및 호출


머리말

동적 링크 라이브러리는 코드 재사용 및 모듈화를 위한 중요한 도구입니다. 이를 통해 함수를 독립 라이브러리로 쉽게 캡슐화할 수 있으며, 동시에 이러한 라이브러리를 동적으로 로드하고 업그레이드할 수 있어 프로그램의 유연성과 유지 관리성이 향상됩니다.
C++ 소스 코드를 동적 링크 라이브러리로 컴파일하고 다른 애플리케이션에서 이 동적 링크 라이브러리를 호출하려는 경우 이것이 이 기사의 애플리케이션 시나리오입니다. 이 문서에서는 C++ 동적 링크 라이브러리를 생성, 컴파일, 링크 및 호출하는 방법을 소개합니다.
PS: 이 글의 다음 내용은 제가 실제 작업한 프로젝트를 바탕으로 작성되었으며, 데모 형식은 아닙니다.


C++ 동적 링크 라이브러리 생성

1단계: C++ 소스 코드 작성

먼저 C++필요한 클래스와 함수를 포함하여 소스 코드 파일을 작성합니다. (이 기사를 읽는 모든 사람은 소스 코드를 가지고 있어야 합니다!)
실제 프로젝트 파일은 다음과 같습니다. 이제 이를 동적 링크 라이브러리로 컴파일
여기에 이미지 설명을 삽입하세요.
해야 합니다 . ai_main.cpp어려운 점은 (완료 후에도 어렵지 않을 것 같다): ai_main.cpp같은 디렉토리에 있는 다른 파일들뿐만 아니라 다른 경로에 있는 소스코드 파일( opencv등) 도 호출된다는 점이다.

2단계: 공유 라이브러리 생성

컴파일러를 사용하여 C++소스 코드를 공유 라이브러리로 컴파일합니다. aarch64-mix210-linux-g++여기서는 컴파일 도구 체인을 사용합니다.

  1. 대상 파일 및 파일을 빌드하는 데 사용될 동일한 디렉터리에 " "라는 build폴더를 만듭니다 .so. 명령줄 터미널을 열고 디렉터리를 입력합니다.
mkdir build && cd build
  1. cpp모든 종속 파일을 대상 파일( .o파일) 로 컴파일하려면 다음 명령을 실행하십시오 .
aarch64-mix210-linux-g++ -c -fPIC -I/home/data/ai/opencv/include -I/home/data/ai/Ascend/ascend-toolkit/5.10.t20.0.b200/arm64-lmixlinux200/aarch64-linux/include ../*.cpp

-c이 옵션은 컴파일러에게 링크 없이 컴파일하도록 지시합니다.
-fPIC옵션은 공유 라이브러리를 구축하는 데 필요한 위치 독립적 코드 생성을 나타냅니다.
-I헤더 파일의 디렉터리를 지정하는 옵션으로, cpp해당 헤더 파일이 다른 파일에서 사용되는 경우에는 이 옵션에 추가해 주어야 한다.
2023년 9월 20일 수정됨: 이후에 생성되는 so 라이브러리의 호출 시간을 줄이기 위해 최적화 매개변수가 추가되었습니다.

aarch64-mix210-linux-g++ -c -fPIC -I/home/data/ai/opencv/include -I/home/data/ai/Ascend/ascend-toolkit/5.10.t20.0.b200/arm64-lmixlinux200/aarch64-linux/include ../*.cpp -O3 -flto -funroll-loops  -finline-functions
  1. 다음 명령을 실행하여 개체 파일을 공유 개체 파일로 연결합니다 .so.
aarch64-mix210-linux-g++ -shared -o libmy_main.so *.o

-shared옵션은 공유 라이브러리 파일 생성을 의미합니다.
-o옵션은 출력 파일 이름을 지정합니다.
2023년 9월 20일 수정됨: 이후에 생성되는 so 라이브러리의 호출 시간을 줄이기 위해 최적화 매개변수가 추가되었습니다.

aarch64-mix210-linux-g++ -shared -o libmy_main.so *.o  -O3 -flto -funroll-loops  -finline-functions 

완료되면 다른 사용자가 동적으로 링크하는 데 사용할 수 있는 공유 라이브러리인 " " 폴더에서 build생성된 파일을 찾을 수 있습니다.libmy_main.so
여기에 이미지 설명을 삽입하세요.

위 명령에서는 자체 컴파일 도구(예: g++)로 대체할 수 있으며, 실제 상황에 따라 파일 이름과 경로를 수정해야 합니다. 또한, 코드가 다른 라이브러리에 종속되어 있는 경우 컴파일/링크 시 이러한 라이브러리가 설치되어 있는지, 관련 옵션이 올바르게 구성되었는지 확인해야 합니다.

3단계: 생성된 SO 파일 확인

다음 명령을 실행하여 생성된 SO 파일을 사용할 수 있는지 확인하십시오.

file libmy_main.so

그러면 다음과 비슷한 내용이 표시됩니다.

libmy_main.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, not stripped

so파일이 성공적으로 생성되었습니다.

기호 링크 확인:
다음 명령을 실행하고 출력에 나중에 호출해야 하는 함수의 정의가 포함되어 있는지 확인하십시오.

nm libmy_main.so | grep ai_track

출력은 다음과 유사합니다.

0000000000061218 T ai_track

위의 결과는 함수가 ai_track생성된 공유 라이브러리에 libmy_main.so표시된다는 것을 나타냅니다. 이는 해당 함수의 정의가 공유 라이브러리에 존재한다는 의미입니다. 다른 프로그램에서 호출하는 함수 ai_track인 자체 외부 인터페이스 함수로 대체해야 합니다 .so

C++ 동적 링크 라이브러리 호출

C++이제 생성된 C++동적 링크 라이브러리를 다른 프로그램에서 호출하는 방법을 보여드리겠습니다 . 테스트를 위해 원본 소스 코드의 컴파일된 부분을 so.

1단계: 원본 makefile 수정

# 注释掉原来调用原代码部分
# SMP_SRCSCPP += $(wildcard $(PWD)/../media/ai/src/*.cpp)
# 添加共享库的头文件和库路径
COMM_INC += -I/home/ai/src/build/include
CFLAGS += -L/home/src/build/lib

# 添加共享库的链接标志,例如 libmy_main.so
CFLAGS += -lmy_main

# 如果共享库是C++库,添加C++编译器标志
CFLAGS += -lstdc++

그 중:
COMM_INC += -I/home/ai/src/build/include: 디렉토리에는 so소스 코드에서 직접 재사용할 수 있는 제공된 함수 인터페이스의 헤더 파일이 포함되어 있습니다 ai_main.h.
CFLAGS += -L/home/src/build/lib: -L 옵션에 지정된 공유 라이브러리 경로가 올바른지 확인하고 libmy_main.so필요한 공유 라이브러리가 포함된 디렉토리를 포함하는지 확인하세요. library; : 일반적으로 공유 라이브러리 이름은 접두사와 접미사에서
CFLAGS += -lmy_main제거되어야 합니다 . 이 경우 에는 ;lib.solibmy_main.so-lmy_main

2단계: 호출 프로그램 컴파일

여기서는 원본을 기반으로 직접 다시 컴파일합니다.

make clean && make -j4

작업이 완료되면 실행 파일이 생성됩니다. 여기서 실행 파일은 임시입니다.run_main

3단계: 호출 프로그램 실행

파일을 실행할 때 동적 링크 라이브러리의 경로를 run_main지정해야 합니다.so

export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH

또는 런타임 연결을 사용할 수 있습니다.

run_main -rpath /path/to/your/library

이는 런타임 시 애플리케이션에 대한 공유 라이브러리의 검색 경로를 지정합니다.

어떤 방법을 선택하든, 애플리케이션이 필요한 공유 라이브러리를 올바르게 찾고 로드할 수 있도록 공유 라이브러리에 대한 경로가 올바르게 설정되었는지 확인하십시오.


요약하다

C++이 문서에서는 동적 링크 라이브러리( 파일)를 만드는 방법 과 다른 프로그램에서 라이브러리를 로드하고 호출하는 so방법을 설명합니다. C++이 글은 주로 저자 자신의 프로젝트에서 시작되며, 그 과정이 모든 사람에게 적용되지는 않을 수 있습니다.
이 글이 도움이 되셨다면 클릭 한 번으로 언제든지 연락주세요! ! !
2023년 9월 5일 14:25:02
여기에 이미지 설명을 삽입하세요.

Guess you like

Origin blog.csdn.net/JulyLi2019/article/details/132686129