내 C ++ 프로젝트에서 로컬로 설치된 SDK의 정적 라이브러리를 어떻게 연결할 수 있습니까?
나는 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.lib
나 rplidar_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)
이 문제를 어떻게 해결할 수 있습니까?
답변
이미 라이브러리를 컴파일 했으므로 포함 경로로 sdk/include
및 sdk/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)
누군가가 업데이트 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 를 빌드 해야합니다.