Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Help creating CMakeList.txt for own project #770

Closed
Hepan02 opened this issue May 7, 2021 · 8 comments
Closed

Help creating CMakeList.txt for own project #770

Hepan02 opened this issue May 7, 2021 · 8 comments

Comments

@Hepan02
Copy link

Hepan02 commented May 7, 2021

Dear Community.
I would like to compile my own project. I have error with **make**. cmake .. works properly.

I tried to compile the example in /Onboard-SDK/sample/platform/telemetry.
I did mkdir build and cd build in telemetry directory.

This is my CMakeList.txt

cmake_minimum_required(VERSION 2.8)
project(djiosdk-telemetry-sample)

# Compiler flags: link with pthread and enable C++11 support
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -g -O0")

# Tell the project where osdk-core is located
if(NOT ONBOARDSDK_SOURCE)
	set(ONBOARDSDK_SOURCE "/home/pi/Onboard-SDK/osdk-core")
	#set(ONBOARDSDK_SOURCE "/usr/local/include")

endif()

# Specify locations for osdk-core headers
include_directories(${ONBOARDSDK_SOURCE}/api/inc)
include_directories(${ONBOARDSDK_SOURCE}/utility/inc)
include_directories(${ONBOARDSDK_SOURCE}/hal/inc)
include_directories(${ONBOARDSDK_SOURCE}/protocol/inc)
include_directories(${ONBOARDSDK_SOURCE}/platform/linux/inc)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../hal)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../osal)
include_directories(include /usr/local/include)
include_directories(${ONBOARDSDK_SOURCE}/../sample/core/inc)

# User-code related project files
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../common)
FILE(GLOB SOURCE_FILES *.hpp *.cpp
	${CMAKE_CURRENT_SOURCE_DIR}/../common/dji_linux_environment.cpp
	${CMAKE_CURRENT_SOURCE_DIR}/../common/dji_linux_helpers.cpp
	main.cpp
	telemetry_sample.cpp
	)

if (OSDK_HOTPLUG)
    FILE(GLOB SOURCE_FILES ${SOURCE_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/../hal/hotplug/*.c)
endif ()

# Target and linking
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} djiosdk-core)

This is the result after make

[ 20%] Linking CXX executable djiosdk-telemetry-sample
/usr/bin/ld: //usr/local/lib/libdjiosdk-core.a(dji_legacy_linker.cpp.o): in function `DJI::OSDK::LegacyLinker::legacyX5SEnableTask(void*)':
/home/pi/Onboard-SDK/osdk-core/api/src/dji_legacy_linker.cpp:69: **undefined reference to `DJI::OSDK**::Linker::getLocalSenderId()'
/usr/bin/ld: /home/pi/Onboard-SDK/osdk-core/api/src/dji_legacy_linker.cpp:71: **undefined reference** to `OsdkOsal_TaskSleepMs'
/usr/bin/ld: /home/pi/Onboard-SDK/osdk-core/api/src/dji_legacy_linker.cpp:72: **undefined reference** to `**DJI::OSDK**::Linker::isUSBPlugged()'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/djiosdk-telemetry-sample.dir/build.make:129: djiosdk-telemetry-sample] Error 1
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/djiosdk-telemetry-sample.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

I often have [100%] Linking CXX executable djiosdk-telemetry-sample.
The main problem is with "undefined reference".
I create CMakeList.txt according to: https://developer.dji.com/onboard-sdk/documentation/development-workflow/integrate-sdk.html

What I should do?

@dji-dev
Copy link
Contributor

dji-dev commented May 7, 2021

Agent comment from kyle.cai in Zendesk ticket #47358:

Dear developer ,

Thank you for contacting DJI.

The lib: libdji-linker.a should be added(linked) to your project.
https://github.com/dji-sdk/Onboard-SDK/tree/master/osdk-core/linker

Thank you for your understanding and support, hope you have a nice day.

Best Regards,
DJI SDK Support Team
inline-703265209.png

°°°

@Hepan02
Copy link
Author

Hepan02 commented May 7, 2021

Dear Agent,
I resolved most problems with "undefined reference". But still have some...
I added:

link_libraries(dji-linker)
link_libraries(${ONBOARDSDK_SOURCE}/linker/${ARCH}/lib/libdji-linker.a)

target_link_libraries(${PROJECT_NAME} PUBLIC djiosdk-core)
target_link_libraries(${PROJECT_NAME} PUBLIC  dji-linker)
target_link_libraries(${PROJECT_NAME} PUBLIC ${ONBOARDSDK_SOURCE}/linker/${ARCH}/lib/libdji-linker.a)
target_include_directories(${PROJECT_NAME} PUBLIC ${LIBUSB_1_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} PUBLIC ${LIBUSB_1_LIBRARIES})
target_link_libraries(${PROJECT_NAME} PUBLIC ${FFMPEG_LIBRARIES})
target_link_libraries(${PROJECT_NAME} PRIVATE advanced-sensing)

It helped but I have now these errors:

/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x8): undefined reference to `OsdkLinux_UartInit'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0xc): undefined reference to `OsdkLinux_UartSendData'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x10): undefined reference to `OsdkLinux_UartReadData'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x14): undefined reference to `OsdkLinux_UartClose'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x18): undefined reference to `OsdkLinux_TaskCreate'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x1c): undefined reference to `OsdkLinux_TaskDestroy'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x20): undefined reference to `OsdkLinux_TaskSleepMs'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x24): undefined reference to `OsdkLinux_MutexCreate'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x28): undefined reference to `OsdkLinux_MutexDestroy'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x2c): undefined reference to `OsdkLinux_MutexLock'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x30): undefined reference to `OsdkLinux_MutexUnlock'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x34): undefined reference to `OsdkLinux_SemaphoreCreate'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x38): undefined reference to `OsdkLinux_SemaphoreDestroy'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x3c): undefined reference to `OsdkLinux_SemaphoreWait'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x40): undefined reference to `OsdkLinux_SemaphoreTimedWait'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x44): undefined reference to `OsdkLinux_SemaphorePost'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x48): undefined reference to `OsdkLinux_GetTimeMs'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x4c): undefined reference to `OsdkLinux_Malloc'
/usr/bin/ld: CMakeFiles/djiosdk-telemetry-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o:(.data+0x50): undefined reference to `OsdkLinux_Free'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/djiosdk-telemetry-sample.dir/build.make:144: djiosdk-telemetry-sample] Error 1
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/djiosdk-telemetry-sample.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

Which library I should also add to the CMakeList.txt?

@Hepan02
Copy link
Author

Hepan02 commented May 7, 2021

@DJI-Jerry
@dji-dev

Can you help me?

@dji-dev
Copy link
Contributor

dji-dev commented May 8, 2021

Agent comment from kyle.cai in Zendesk ticket #47358:

Dear developer ,

Thank you for contacting DJI.


source code file: osdkhal_linux.c should be added to your compile environment:
https://github.com/dji-sdk/Onboard-SDK/tree/master/sample/platform/linux/hal
https://github.com/dji-sdk/Onboard-SDK/tree/master/sample/platform/linux/osal

Thank you for your understanding and support, hope you have a nice day.

Best Regards,
DJI SDK Support Team
inline1901882263.png

°°°

@Hepan02
Copy link
Author

Hepan02 commented May 8, 2021

Dear, Agent. Now it works. Thank you!

FILE(GLOB SOURCE_FILES *.hpp *.cpp
	${CMAKE_CURRENT_SOURCE_DIR}/../common/dji_linux_environment.cpp
	${CMAKE_CURRENT_SOURCE_DIR}/../common/dji_linux_helpers.cpp
	${CMAKE_CURRENT_SOURCE_DIR}/../hal/osdkhal_linux.c
	${CMAKE_CURRENT_SOURCE_DIR}/../osal/osdkosal_linux.c
	)

@Hepan02
Copy link
Author

Hepan02 commented May 8, 2021

The proper CMakeList.txt for creating your own project (example based on telemetry sample):

cmake_minimum_required(VERSION 2.8)
project(djiosdk-telemetry-sample)

set(ARCH armv7)

# Compiler flags: link with pthread and enable C++11 support
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -g -O0")


# Tell the project where osdk-core is located
if(NOT ONBOARDSDK_SOURCE)
	set(ONBOARDSDK_SOURCE "/home/pi/Onboard-SDK/osdk-core")
endif()
set(CURRENT_CMAKE_MODULE_PATH ${ONBOARDSDK_SOURCE}/cmake-modules)

# Specify locations for osdk-core headers
include_directories(${ONBOARDSDK_SOURCE}/api/inc)
include_directories(${ONBOARDSDK_SOURCE}/utility/inc)
include_directories(${ONBOARDSDK_SOURCE}/hal/inc)
include_directories(${ONBOARDSDK_SOURCE}/protocol/inc)
include_directories(${ONBOARDSDK_SOURCE}/platform/linux/inc)
include_directories(${ONBOARDSDK_SOURCE}/linker/${ARCH}/inc)
include_directories(${ONBOARDSDK_SOURCE}/../sample/platform/linux/hal)
include_directories(${ONBOARDSDK_SOURCE}/../sample/platform/linux/hal/hotplug)
include_directories(${ONBOARDSDK_SOURCE}/../sample/platform/linux/osal)
include_directories(include /usr/local/include)
include_directories(include /usr/local/lib)
include_directories(${ONBOARDSDK_SOURCE}/../sample/core/inc)


# User-code related project files
include_directories(${ONBOARDSDK_SOURCE}/../sample/platform/linux/common)
FILE(GLOB SOURCE_FILES *.hpp *.cpp
	${ONBOARDSDK_SOURCE}/../sample/platform/linux/common/dji_linux_environment.cpp
	${ONBOARDSDK_SOURCE}/../sample/platform/linux/common/dji_linux_helpers.cpp
	${ONBOARDSDK_SOURCE}/../sample/platform/linux/hal/osdkhal_linux.c
	${ONBOARDSDK_SOURCE}/../sample/platform/linux/osal/osdkosal_linux.c
	)

if (OSDK_HOTPLUG)
    FILE(GLOB SOURCE_FILES ${SOURCE_FILES} ${ONBOARDSDK_SOURCE}/../sample/platform/linux/hal/hotplug/*.c)
endif ()

link_libraries(dji-linker)
link_directories(/usr/local/include /usr/local/lib)
link_libraries(${ONBOARDSDK_SOURCE}/linker/${ARCH}/lib/libdji-linker.a)

set(CMAKE_MODULE_PATH ${CURRENT_CMAKE_MODULE_PATH})
find_package(LibUSB REQUIRED)
find_package(FFMPEG REQUIRED)
include_directories(${ADVANCED_SENSING_HEADERS_DIR})

# Target and linking
add_executable(${PROJECT_NAME} ${SOURCE_FILES})

target_link_libraries(${PROJECT_NAME} PUBLIC djiosdk-core)
target_link_libraries(${PROJECT_NAME} PUBLIC  dji-linker)
target_link_libraries(${PROJECT_NAME} PUBLIC ${ONBOARDSDK_SOURCE}/linker/${ARCH}/lib/libdji-linker.a)
target_include_directories(${PROJECT_NAME} PUBLIC ${LIBUSB_1_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} PUBLIC ${LIBUSB_1_LIBRARIES})
target_link_libraries(${PROJECT_NAME} PUBLIC ${FFMPEG_LIBRARIES})
target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${ADVANCED_SENSING_HEADERS_DIR}>)
target_link_libraries(${PROJECT_NAME} PRIVATE advanced-sensing)
target_include_directories(${PROJECT_NAME} PUBLIC ${FFMPEG_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} PUBLIC ${FFMPEG_LIBRARIES})

@Hepan02 Hepan02 closed this as completed May 8, 2021
@highfreq
Copy link

highfreq commented Nov 22, 2021

Tested you CMakelists.txt for telemetry and it works, do you know what adjustments should be done to have it working for flight-control ??
If i use same CMakeLists.txt as the one used to build telemetry it fails at the end when linking CXX executable.
I am trying to understand what each needs.

Scanning dependencies of target djiosdk-flightcontrol-sample
[ 14%] Building CXX object CMakeFiles/djiosdk-flightcontrol-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_environment.cpp.o
[ 28%] Building CXX object CMakeFiles/djiosdk-flightcontrol-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/common/dji_linux_helpers.cpp.o
[ 42%] Building C object CMakeFiles/djiosdk-flightcontrol-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/hal/osdkhal_linux.c.o
[ 57%] Building C object CMakeFiles/djiosdk-flightcontrol-sample.dir/home/pi/Onboard-SDK/sample/platform/linux/osal/osdkosal_linux.c.o
[ 71%] Building CXX object CMakeFiles/djiosdk-flightcontrol-sample.dir/flight_control_sample.cpp.o
[ 85%] Building CXX object CMakeFiles/djiosdk-flightcontrol-sample.dir/main.cpp.o
[100%] Linking CXX executable djiosdk-flightcontrol-sample
/usr/bin/ld: CMakeFiles/djiosdk-flightcontrol-sample.dir/main.cpp.o: in function main': /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:72: undefined reference to FlightSample::FlightSample(DJI::OSDK::Vehicle*)'
/usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:95: undefined reference to FlightSample::monitoredTakeoff(int)' /usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:96: undefined reference to FlightSample::monitoredLanding(int)'
/usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:101: undefined reference to FlightSample::monitoredTakeoff(int)' /usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:104: undefined reference to FlightSample::moveByPositionOffset(DJI::OSDK::Telemetry::Vector3f const&, float, float, float)'
/usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:106: undefined reference to FlightSample::moveByPositionOffset(DJI::OSDK::Telemetry::Vector3f const&, float, float, float)' /usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:108: undefined reference to FlightSample::moveByPositionOffset(DJI::OSDK::Telemetry::Vector3f const&, float, float, float)'
/usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:110: undefined reference to FlightSample::monitoredLanding(int)' /usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:118: undefined reference to FlightSample::monitoredTakeoff(int)'
/usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:123: undefined reference to FlightSample::moveByPositionOffset(DJI::OSDK::Telemetry::Vector3f const&, float, float, float)' /usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:126: undefined reference to FlightSample::moveByPositionOffset(DJI::OSDK::Telemetry::Vector3f const&, float, float, float)'
/usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:129: undefined reference to FlightSample::setNewHomeLocation(int)' /usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:132: undefined reference to FlightSample::setGoHomeAltitude(unsigned short, int)'
/usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:135: undefined reference to FlightSample::moveByPositionOffset(DJI::OSDK::Telemetry::Vector3f const&, float, float, float)' /usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:140: undefined reference to FlightSample::goHomeAndConfirmLanding(int)'
/usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:149: undefined reference to FlightSample::monitoredTakeoff(int)' /usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:152: undefined reference to FlightSample::velocityAndYawRateCtrl(DJI::OSDK::Telemetry::Vector3f const&, float, unsigned int)'
/usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:154: undefined reference to FlightSample::emergencyBrake()' /usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:156: undefined reference to FlightSample::velocityAndYawRateCtrl(DJI::OSDK::Telemetry::Vector3f const&, float, unsigned int)'
/usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:158: undefined reference to FlightSample::emergencyBrake()' /usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:160: undefined reference to FlightSample::velocityAndYawRateCtrl(DJI::OSDK::Telemetry::Vector3f const&, float, unsigned int)'
/usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:162: undefined reference to FlightSample::emergencyBrake()' /usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:164: undefined reference to FlightSample::velocityAndYawRateCtrl(DJI::OSDK::Telemetry::Vector3f const&, float, unsigned int)'
/usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:166: undefined reference to FlightSample::emergencyBrake()' /usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:169: undefined reference to FlightSample::monitoredLanding(int)'
/usr/bin/ld: /home/pi/Onboard-SDK/sample/platform/linux/flight-control/main.cpp:178: undefined reference to `FlightSample::~FlightSample()'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/djiosdk-flightcontrol-sample.dir/build.make:183: djiosdk-flightcontrol-sample] Error 1
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/djiosdk-flightcontrol-sample.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

A bunch of undefined references to FlightSample.

@highfreq
Copy link

highfreq commented Dec 9, 2021

Please help me in linking what is missing when compilint only flight-control.
Cmake works but when i compile i get the error : undefined reference to `FlightSample::FlightSample(DJI::OSDK::Vehicle*)'

Could you please let me know what to add to CMakeLists.txt to have it working?

Please DO NOT link me to a useless github or forum answer, i already went troygh all of them and didn't find an answer.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants