내 C ++ 프로젝트에서 로컬로 설치된 SDK의 정적 라이브러리를 어떻게 연결할 수 있습니까?

Nov 23 2020

나는 RPLidar SDK에 의존하는 C ++ 프로젝트에서 일하고 있습니다 . README의 지침에 따라 SDK를 이미 설치했습니다. (참고 : 명령을 /usr/local/사용 하여 디렉토리에 설치할 수 없습니다 sudo make install.) SDK 문서에 따라 :

RPLIDAR SDK를 통해 개발할 때 개발자는 SDK의 외부 헤더 파일 (sdk \ include 아래)을 자체 소스 코드에 포함하고 애플리케이션을 SDK의 정적 라이브러리 (rplidar_driver.lib 또는 rplidar_driver.a)와 연결하기 만하면됩니다.

따라서에서 CMakeLists.txt이미 다음을 추가했습니다.

include_directories(/home/milan/rplidar_sdk/sdk/sdk/include/)

그러나, 나는 찾을 수 없습니다 rplidar_driver.librplidar_driver.h. 다음은 SDK의 디렉토리 구조입니다.

.
├── docs
│   ├── ReleaseNote.v1.10.0.md
│   |       ...
│   └── ReleaseNote.v1.9.1.md
├── LICENSE
├── README.md
├── sdk
│   ├── app
│   │   ├── frame_grabber
│   │   │   ├── AboutDlg.cpp
│   │   │   ├── AboutDlg.h
│   │   │   ├── drvlogic
│   │   │   │   ├── common.h
│   │   │   │   ├── lidarmgr.cpp
│   │   │   │   └── lidarmgr.h
│   │   │   ├── framegrabber.cpp
│   │   │   ├── framegrabber.h
│   │   │   ├── framegrabber.rc
│   │   │   ├── FreqSetDlg.cpp
│   │   │   ├── FreqSetDlg.h
│   │   │   ├── MainFrm.cpp
│   │   │   ├── MainFrm.h
│   │   │   ├── ref
│   │   │   │   └── wtl
│   │   │   │       ├── atlapp.h
│   │   │   │       ├── atlcrack.h
│   │   │   │       ├── atlctrls.h
│   │   │   │       ├── atlctrlw.h
│   │   │   │       ├── atlctrlx.h
│   │   │   │       ├── atlddx.h
│   │   │   │       ├── atldlgs.h
│   │   │   │       ├── atldwm.h
│   │   │   │       ├── atlfind.h
│   │   │   │       ├── atlframe.h
│   │   │   │       ├── atlgdi.h
│   │   │   │       ├── atlmisc.h
│   │   │   │       ├── atlprint.h
│   │   │   │       ├── atlresce.h
│   │   │   │       ├── atlres.h
│   │   │   │       ├── atlribbon.h
│   │   │   │       ├── atlscrl.h
│   │   │   │       ├── atlsplit.h
│   │   │   │       ├── atltheme.h
│   │   │   │       ├── atluser.h
│   │   │   │       ├── atlwince.h
│   │   │   │       └── atlwinx.h
│   │   │   ├── res
│   │   │   │   ├── rplidar.ico
│   │   │   │   └── Toolbar.bmp
│   │   │   ├── resource.h
│   │   │   ├── scanView.cpp
│   │   │   ├── scanView.h
│   │   │   ├── SerialSelDlg.cpp
│   │   │   ├── SerialSelDlg.h
│   │   │   ├── stdafx.cpp
│   │   │   ├── stdafx.h
│   │   │   ├── TcpChannelSelDlg.cpp
│   │   │   └── TcpChannelSelDlg.h
│   │   ├── Makefile
│   │   ├── simple_grabber
│   │   │   ├── main.cpp
│   │   │   └── Makefile
│   │   └── ultra_simple
│   │       ├── main.cpp
│   │       └── Makefile
│   ├── cross_compile.sh
│   ├── mak_common.inc
│   ├── mak_def.inc
│   ├── Makefile
│   ├── obj
│   │   └── Linux
│   │       └── Release
│   │           ├── sdk
│   │           │   └── src
│   │           │       ├── arch
│   │           │       │   └── linux
│   │           │       │       ├── net_serial.o
│   │           │       │       ├── net_socket.o
│   │           │       │       └── timer.o
│   │           │       ├── hal
│   │           │       │   └── thread.o
│   │           │       └── rplidar_driver.o
│   │           ├── simple_grabber
│   │           │   └── main.o
│   │           └── ultra_simple
│   │               └── main.o
│   ├── output
│   │   └── Linux
│   │       └── Release
│   │           ├── librplidar_sdk.a
│   │           ├── simple_grabber
│   │           └── ultra_simple
│   ├── sdk
│   │   ├── include
│   │   │   ├── rplidar_cmd.h
│   │   │   ├── rplidar_driver.h
│   │   │   ├── rplidar.h
│   │   │   ├── rplidar_protocol.h
│   │   │   └── rptypes.h
│   │   ├── Makefile
│   │   └── src
│   │       ├── arch
│   │       │   ├── linux
│   │       │   │   ├── arch_linux.h
│   │       │   │   ├── net_serial.cpp
│   │       │   │   ├── net_serial.h
│   │       │   │   ├── net_socket.cpp
│   │       │   │   ├── thread.hpp
│   │       │   │   ├── timer.cpp
│   │       │   │   └── timer.h
│   │       │   ├── macOS
│   │       │   │   ├── arch_macOS.h
│   │       │   │   ├── net_serial.cpp
│   │       │   │   ├── net_serial.h
│   │       │   │   ├── net_socket.cpp
│   │       │   │   ├── thread.hpp
│   │       │   │   ├── timer.cpp
│   │       │   │   └── timer.h
│   │       │   └── win32
│   │       │       ├── arch_win32.h
│   │       │       ├── net_serial.cpp
│   │       │       ├── net_serial.h
│   │       │       ├── net_socket.cpp
│   │       │       ├── timer.cpp
│   │       │       ├── timer.h
│   │       │       └── winthread.hpp
│   │       ├── hal
│   │       │   ├── abs_rxtx.h
│   │       │   ├── assert.h
│   │       │   ├── byteops.h
│   │       │   ├── event.h
│   │       │   ├── locker.h
│   │       │   ├── socket.h
│   │       │   ├── thread.cpp
│   │       │   ├── thread.h
│   │       │   ├── types.h
│   │       │   └── util.h
│   │       ├── rplidar_driver.cpp
│   │       ├── rplidar_driver_impl.h
│   │       ├── rplidar_driver_serial.h
│   │       ├── rplidar_driver_TCP.h
│   │       └── sdkcommon.h
│   └── workspaces
│       ├── vc10
│       │   ├── frame_grabber
│       │   │   ├── frame_grabber.vcxproj
│       │   │   └── frame_grabber.vcxproj.filters
│       │   ├── rplidar_driver
│       │   │   ├── rplidar_driver.vcxproj
│       │   │   └── rplidar_driver.vcxproj.filters
│       │   ├── sdk_and_demo.sln
│       │   ├── simple_grabber
│       │   │   ├── simple_grabber.vcxproj
│       │   │   └── simple_grabber.vcxproj.filters
│       │   └── ultra_simple
│       │       ├── ultra_simple.vcxproj
│       │       └── ultra_simple.vcxproj.filters
│       └── vc14
│           ├── frame_grabber
│           │   ├── frame_grabber.vcxproj
│           │   └── frame_grabber.vcxproj.filters
│           ├── rplidar_driver
│           │   ├── rplidar_driver.vcxproj
│           │   └── rplidar_driver.vcxproj.filters
│           ├── sdk_and_demo.sln
│           ├── simple_grabber
│           │   ├── simple_grabber.vcxproj
│           │   └── simple_grabber.vcxproj.filters
│           └── ultra_simple
│               ├── ultra_simple.vcxproj
│               └── ultra_simple.vcxproj.filters
└── tools
    └── cp2102_driver
        └── CP210x_Windows_Drivers.zip

이제 내에 main.cpp는 다음 줄이 있습니다 #include <rplidar.h>.. 내 프로젝트 cmake ..build디렉토리 에서 명령을 성공적으로 실행할 수 있습니다 . 그러나 make명령 을 실행 하면 다음 오류가 발생합니다.

In file included from /home/milan/<project>/src/main.cpp:3:0:
/home/milan/rplidar_sdk/sdk/sdk/include/rplidar.h:38:10: fatal error: hal/types.h: No such file or directory
 #include "hal/types.h"
          ^~~~~~~~~~~~~
compilation terminated.
CMakeFiles/<project>.dir/build.make:81: recipe for target 'CMakeFiles/<project>.dir/src/main.cpp.o' failed
make[2]: *** [CMakeFiles/<project>.dir/src/main.cpp.o] Error 1
CMakeFiles/Makefile2:94: recipe for target 'CMakeFiles/<project>.dir/all' failed
make[1]: *** [CMakeFiles/<project>.dir/all] Error 2
Makefile:102: recipe for target 'all' failed
make: *** [all] Error 2

여기에 내 완성이 있습니다 CMakeLists.txt.

cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)

project(<project>)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)

include_directories(include)
include_directories(/home/milan/rplidar_sdk/sdk/sdk/include/)

add_executable(${PROJECT_NAME} src/main.cpp)

이 문제를 어떻게 해결할 수 있습니까?

답변

1 Botje Nov 24 2020 at 00:32

이미 라이브러리를 컴파일 했으므로 포함 경로로 sdk/includesdk/src디렉토리 를 참조하는 IMPORTED 대상을 만듭니다 .

add_library(rplidar STATIC IMPORTED)
set_property(TARGET rplidar
  PROPERTY IMPORTED_LOCATION /home/milan/rplidar_sdk/output/Linux/Release/librplidar_sdk.a)
target_include_directories(rplidar INTERFACE
  /home/milan/rplidar_sdk/sdk/sdk/include/
  /home/milan/rplidar_sdk/sdk/sdk/src/)

sdk/arch/linux포함 경로에 디렉토리를 추가해야 할 수도 있습니다 .

이제 다음을 수행하여 해당 라이브러리를 기본 파일에 연결할 수 있습니다.

target_link_libraries(${PROJECT_NAME} rplidar)
Milan Nov 27 2020 at 23:05

누군가가 업데이트 CMakeLists.txt를 직접 찾고 있다면 여기에 있습니다 (@Botje 덕분에 특별합니다).

cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)

project(<project_name>)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
SET(CMAKE_CXX_FLAGS -pthread)

include_directories(include)
add_executable(${PROJECT_NAME} src/main.cpp src/another_src_file.cpp) ## RPLidar # Update the following path variable as per the RPLidar SDK installation in your system! set(RPLIDAR_SDK_PATH "/home/milan/rplidar_sdk/") add_library(rplidar STATIC IMPORTED) set_property(TARGET rplidar PROPERTY IMPORTED_LOCATION ${RPLIDAR_SDK_PATH}/sdk/output/Linux/Release/librplidar_sdk.a)

target_include_directories(rplidar INTERFACE
  ${RPLIDAR_SDK_PATH}/sdk/sdk/include/ ${RPLIDAR_SDK_PATH}/sdk/sdk/src/)

target_link_libraries(${PROJECT_NAME} rplidar)

참고 : 먼저 rplidar_sdk 를 빌드 해야합니다.