Nvidia Xavier NX 보드에서 C++ 소스의 컴파일 및 실행을 위한 일련의 과정이다.
- 설치 환경
[윈도우] Visual Studio Code
[리눅스] Nvidia Xavier NX Board (Ubuntu 18.04 version)
- 사용 언어
C, C++ with nvcc compiler
1. 리눅스에 접속
1. 먼저 윈도우 환경에서 개발을 위하여 VS Code를 설치하고, SSH Remote Control을 통해 원격으로 리눅스에 접속한다.
2. VS Code의 좌측 아이콘 중 "원격 탐색기"를 선택 후 SSH로 리눅스에 접속한다.
만약 원격 탐색기 아이콘이 보이지 않을 경우, VS Code를 재시작 한다.
추가로 SSH 접속 시 기본적으로 config 파일이 자동 생성 되는데, 해당 파일은 윈도우의 "사용자 계정명" 폴더에 생성된다.
만약 사용자 계정이 한글로 설정된 경우 간혹 SSH 연결이 제대로 되지 않은 경우가 있다.
다른 분의 좋은 글이 있어 추가한다.
https://github.com/swsnu/swppfall2020/issues/213
3. 연결에 성공하면 VS Code가 재시작되고 아래 사진처럼 폴더 열기 시 원격의 폴더 목록들이 나온다.
원하는 Workspace를 선택하자. VS Code 시작과 동시에 비밀번호 입력 창이 나오는데 리눅스 계정의 비밀번호를 입력해준다.
2. 빌드 및 실행
일단 리눅스를 써본 적이 없다..
물론 학부 시절 기본적인 Command는 배웠고, 소스 파일 한 두개는 gcc -c ~~.cpp ~~.o,
gcc -o ~~.o ~~ 처럼 빌드해보겠는데, 회사의 소스 코드양은 방대하다. 더구나 다양한 외부 라이브러리, Include 경로 등을 포함한다.
이 모든게 Visual Studio에선 "프로젝트 속성" 에서 Addtional include directory 또는 추가 종속성 등 간단하게 처리되고 빌드된다는게...
새삼 IDE의 소중함을 느꼈다.
일단 인터넷에 나온대로 tasks.json을 만들었더니,
한 개의 소스 코드만 빌드된다.(당연히 외부 헤더파일들을 찾을 수 없어 에러도 발생한다)
compiler argument에 -I 옵션으로 include 폴더를 추가했다. 역시나 library가 링크되지 않아 오류가 발생된다.
구글링을 통해 library 등록까지 하고 빌드해보니 여전히 소스코드는 한 개만 빌드되고,
**.cpp 를 사용해 빌드를 할 수 있다고 하는데, 이 와중에 Makefiles를 알게 되었다.
결과적으로 이 Makefile을 자동으로 생성해주고 빌드 해주는 아주 편리한 툴이 CMake라는 것을 알게 되었고,
본문에선 이를 활용한다. tasks.json, Makefile을 직접 작성 하는 것보다 수만배 간단했다.
구조를 보면 Common에도 많은 파일이 있고,
헤더는 inc, 소스는 src에 담겼으며, root 경로에 main.cpp가 위치한다.
이를 빌드하기 위한 CMakeLists.txt를 생성하고 내용은 아래와 같다.
#요구 CMake 최소 버전
CMAKE_MINIMUM_REQUIRED ( VERSION 3.0 )
# 프로젝트 이름 및 버전
PROJECT ( "AAAAAAA" )
SET ( PROJECT_VERSION_MAJOR 1 )
SET ( PROJECT_VERSION_MINOR 0 )
# 빌드 형상
SET ( CMAKE_BUILD_TYPE Debug )
SET ( CMAKE_VERBOSE_MAKEFILE true )
# 컴파일러 세팅
SET ( CMAKE_C_COMPILER "gcc" )
SET ( CMAKE_CXX_COMPILER "/usr/local/cuda/bin/nvcc" )
# 이걸 해줘야 nvcc 빌드 시 -rdynamic unknown 에러가 안남
SET ( CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
# 소스파일 목록
file( GLOB SOURCES
Common/*.cpp
*.cpp
src/*.cpp
)
# Include 추가 포함 디렉토리
INCLUDE_DIRECTORIES(
/usr/include/gstreamer-1.0
/usr/include/glib-2.0
/usr/local/cuda/targets/aarch64-linux/include
/usr/include/opencv4
inc
)
SET ( CMAKE_EXE_LINKER_FLAGS " " )
# 공통 링크 라이브러리 디렉토리
# LINK_DIRECTORIES 사용하면 -Wl,-rpath가 생성되는데, nvcc에서 인식 불가
set (CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES
/usr/lib/aarch64-linux-gnu/
/usr/local/lib/
/usr/local/cuda-10.2/targets/aarch64-linux/lib
)
# 공통 링크 라이브러리
LINK_LIBRARIES (
pthread
cudnn
glib-2.0
gobject-2.0
gstapp-1.0
gstreamer-1.0
gstrtsp-1.0
nvinfer
opencv_core
opencv_highgui
opencv_imgcodecs
opencv_imgproc
opencv_video
opencv_videoio
opencv_calib3d
opencv_features2d
cudart
curand
cublas
sqlite3
jsoncpp
)
# 공통 컴파일 옵션, 링크 옵션
ADD_COMPILE_OPTIONS ( -std=c++11 -w )
SET ( CMAKE_EXE_LINKER_FLAGS " " )
# 출력 디렉토리
SET ( CMAKE_RUNTIME_OUTPUT_DIRECTORY ../bin/${CMAKE_BUILD_TYPE} )
#set(ADD_COMPILE_OPTIONS "")
add_executable(${PROJECT_NAME} ${SOURCES} )
당연히 필요한 부분은 자신에게 맞게 수정하면 된다.
nvcc 관련 특이사항으로 gcc를 이용하면 LINK_DIRECTORY를 사용해서 Library 경로를 명시하라고 많은 예제에서 얘기하는데...
실제로 돌려보면 -Wl,-rpath ~~경로와 같이 콤마(,)도 포함되고, rpath를 nvcc에서 인식하지 못했다.
마찬가지로 기본적으로 빌드를 눌러보면
gcc ~~~ -rdynamic ~~~
와 같이 rdynamic 인자가 자동으로 추가되는데 이 역시 CUDA 10.2 버전의 nvcc에선 unknown options으로 이해하지 못했다.
따라서 Link시 Flag를 제외시켰다.
결과적으로 빌드에 성공하였고, 빌드와 디버깅은 아래와 같이 VS Code의 파레트에서 아래 명령을 선택한다.
우리는 당연히 tasks.json을 수정하지 않았기 때문에 아래 옵션은 동작하지 않는다.(VS Code 기본 빌드)
'System' 카테고리의 다른 글
JetPack 5.1.2 버전에서 ttyTHS1가 없을 때 (0) | 2024.06.25 |
---|---|
[Linux] Visual Studio 2019에서 코딩하기 (0) | 2021.10.20 |
[Jetson] xavier NX 보드를 SSD에서 실행하기 (0) | 2021.10.18 |