configuring for cross development
-
Hi all -
I've attempted this before, but gave up early. I'd like to return my attention to the effort.
I'm trying to use Qt Creator as my IDE for a non-Qt project, hosted on an ESP32 device. When I attempt to open the project's CMakeLists.txt file, I get this error:
C:\.espressif\tools\cmake\3.20.3\share\cmake-3.20\Modules\CMakeTestCCompiler.cmake:66: error: The C compiler "C:/.espressif/tools/xtensa-esp32-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc.exe" is not able to compile a simple test program. It fails with the following output: Change Dir: C:/repos/iQPump-ESP32/fw/build-main-ESP32-Debug/CMakeFiles/CMakeTmp Run Build Command(s):C:/Qt/Tools/Ninja/ninja.exe cmTC_8a838 && [1/2] Building C object CMakeFiles/cmTC_8a838.dir/testCCompiler.c.obj [2/2] Linking C executable cmTC_8a838.exe FAILED: cmTC_8a838.exe cmd.exe /C "cd . && C:\.espressif\tools\xtensa-esp32-elf\esp-2021r2-patch3-8.4.0\xtensa-esp32-elf\bin\xtensa-esp32-elf-gcc.exe CMakeFiles/cmTC_8a838.dir/testCCompiler.c.obj -o cmTC_8a838.exe -Wl,--out-implib,libcmTC_8a838.dll.a -Wl,--major-image-version,0,--minor-image-version,0 && cd ." c:/.espressif/tools/xtensa-esp32-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: unrecognized option '--major-image-version' c:/.espressif/tools/xtensa-esp32-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: use the --help option for usage information collect2.exe: error: ld returned 1 exit status ninja: build stopped: subcommand failed.
I'm not sure how to interpret this error message -- is it saying that it's unable to link my project?
Thanks...
EDIT: I found my way to a log file, and it contained this error:
c:/.espressif/tools/xtensa-esp32-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: unrecognized option '--major-image-version'
It's not clear to me where this option is supposed to be set...any ideas?
-
If you grep after
--major-image-version
in your CMake installation atC:\.espressif\tools\cmake\3.20.3\share\cmake-3.20\Modules
you would get a result in:C:\.espressif\tools\cmake\3.20.3\share\cmake-3.20\Modules\Platform\CYGWIN-GNU.cmake C:\.espressif\tools\cmake\3.20.3\share\cmake-3.20\Modules\Platform\Windows-Clang.cmake C:\.espressif\tools\cmake\3.20.3\share\cmake-3.20\Modules\Platform\Windows-GNU.cmake
Windows-GNU.cmake
would have something like:set(CMAKE_GNULD_IMAGE_VERSION "-Wl,--major-image-version,<TARGET_VERSION_MAJOR>,--minor-image-version,<TARGET_VERSION_MINOR>")
As your toolchain linker doesn't support this parameter, you should follow the instruction from https://cmake.org/cmake/help/v3.20/manual/cmake-toolchains.7.html and create a toolchain file for your ... toolchain.
Or if this is too complicated, can try to set in your project's
CMakeLists.txt
after theproject()
call:set(CMAKE_GNULD_IMAGE_VERSION "")
But this would make CMake use your gcc as a Windows GCC toolchain, which is not the case.
Coming back to the toolchain file, apparently the
esp-idf
github project has something like thisinclude($ENV{IDF_PATH}/tools/cmake/utilities.cmake) set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_C_COMPILER xtensa-esp32-elf-gcc) set(CMAKE_CXX_COMPILER xtensa-esp32-elf-g++) set(CMAKE_ASM_COMPILER xtensa-esp32-elf-gcc) set(_CMAKE_TOOLCHAIN_PREFIX xtensa-esp32-elf-) remove_duplicated_flags("-mlongcalls -Wno-frame-address ${CMAKE_C_FLAGS}" UNIQ_CMAKE_C_FLAGS) set(CMAKE_C_FLAGS "${UNIQ_CMAKE_C_FLAGS}" CACHE STRING "C Compiler Base Flags" FORCE) remove_duplicated_flags("-mlongcalls -Wno-frame-address ${CMAKE_CXX_FLAGS}" UNIQ_CMAKE_CXX_FLAGS) set(CMAKE_CXX_FLAGS "${UNIQ_CMAKE_CXX_FLAGS}" CACHE STRING "C++ Compiler Base Flags" FORCE)
Which is done in "classic" style and requires set forcing of compiler flags. A better way can be found here https://www.qt.io/blog/standalone-boot2qt-/-yocto-sdk-cmake-toolchain
-
If you grep after
--major-image-version
in your CMake installation atC:\.espressif\tools\cmake\3.20.3\share\cmake-3.20\Modules
you would get a result in:C:\.espressif\tools\cmake\3.20.3\share\cmake-3.20\Modules\Platform\CYGWIN-GNU.cmake C:\.espressif\tools\cmake\3.20.3\share\cmake-3.20\Modules\Platform\Windows-Clang.cmake C:\.espressif\tools\cmake\3.20.3\share\cmake-3.20\Modules\Platform\Windows-GNU.cmake
Windows-GNU.cmake
would have something like:set(CMAKE_GNULD_IMAGE_VERSION "-Wl,--major-image-version,<TARGET_VERSION_MAJOR>,--minor-image-version,<TARGET_VERSION_MINOR>")
As your toolchain linker doesn't support this parameter, you should follow the instruction from https://cmake.org/cmake/help/v3.20/manual/cmake-toolchains.7.html and create a toolchain file for your ... toolchain.
Or if this is too complicated, can try to set in your project's
CMakeLists.txt
after theproject()
call:set(CMAKE_GNULD_IMAGE_VERSION "")
But this would make CMake use your gcc as a Windows GCC toolchain, which is not the case.
Coming back to the toolchain file, apparently the
esp-idf
github project has something like thisinclude($ENV{IDF_PATH}/tools/cmake/utilities.cmake) set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_C_COMPILER xtensa-esp32-elf-gcc) set(CMAKE_CXX_COMPILER xtensa-esp32-elf-g++) set(CMAKE_ASM_COMPILER xtensa-esp32-elf-gcc) set(_CMAKE_TOOLCHAIN_PREFIX xtensa-esp32-elf-) remove_duplicated_flags("-mlongcalls -Wno-frame-address ${CMAKE_C_FLAGS}" UNIQ_CMAKE_C_FLAGS) set(CMAKE_C_FLAGS "${UNIQ_CMAKE_C_FLAGS}" CACHE STRING "C Compiler Base Flags" FORCE) remove_duplicated_flags("-mlongcalls -Wno-frame-address ${CMAKE_CXX_FLAGS}" UNIQ_CMAKE_CXX_FLAGS) set(CMAKE_CXX_FLAGS "${UNIQ_CMAKE_CXX_FLAGS}" CACHE STRING "C++ Compiler Base Flags" FORCE)
Which is done in "classic" style and requires set forcing of compiler flags. A better way can be found here https://www.qt.io/blog/standalone-boot2qt-/-yocto-sdk-cmake-toolchain
@cristian-adam thank you for the detailed reply. I'm still trying to understand how the CMake process operates, so I have a few more questions, if you don't mind:
-
do I understand correctly that Creator is attempting to use Windows-GNU.cmake in the build? If so, is this correct?
-
you mention a toolchain file. Is this the same as a CMake Source File (as shown in the Windows Explorer window)?
-
if I were to make my own toolchain file, where should it reside? I don't want to modify the contents of the .espressif/tools directory.
-
would you consider this a bug in the Espressif toolchain? If so, I can submit an entry on their github.
Thank you again.
-
-
@cristian-adam thank you for the detailed reply. I'm still trying to understand how the CMake process operates, so I have a few more questions, if you don't mind:
-
do I understand correctly that Creator is attempting to use Windows-GNU.cmake in the build? If so, is this correct?
-
you mention a toolchain file. Is this the same as a CMake Source File (as shown in the Windows Explorer window)?
-
if I were to make my own toolchain file, where should it reside? I don't want to modify the contents of the .espressif/tools directory.
-
would you consider this a bug in the Espressif toolchain? If so, I can submit an entry on their github.
Thank you again.
@mzimmers said in configuring for cross development:
@cristian-adam thank you for the detailed reply. I'm still trying to understand how the CMake process operates, so I have a few more questions, if you don't mind:
- do I understand correctly that Creator is attempting to use Windows-GNU.cmake in the build? If so, is this correct?
This is what CMake is doing. Qt Creator has nothing to do with it. CMake is receiving a
gcc.exe
and it looks at the host platform ...Windows
so it picks up itsWindows-GNU.cmake
internal code path and tries the best out of it. Since this is not a MinGW GCC toolchain is bound to fail.-
you mention a toolchain file. Is this the same as a CMake Source File (as shown in the Windows Explorer window)?
-
if I were to make my own toolchain file, where should it reside? I don't want to modify the contents of the .espressif/tools directory.
You need a
esp.cmake
text file, which we would refer as toolchain file, and then in Qt Creator (or commandline) pass theCMAKE_TOOLCHAIN_FILE
variable pointing to this file.- would you consider this a bug in the Espressif toolchain? If so, I can submit an entry on their github.
I personally have no interest in the esp toolchain, it's the first time I've heard about it.
Their toolchain is not buggy, it's just doing extra work and makes it a bit hard to follow, it's not as easy to copy paste, it needs the extra API file (e.g.
$ENV{IDF_PATH}/tools/cmake/utilities.cmake
), etc.But on the other hand you might need to follow their documentation about the CMake support.
-