How to partially disabling cmake C/C++ custom comp

2019-01-19 08:57发布

问题:

I am trying to do some crosscompilation using cmake. Some are easy with all the examples on Internet, I managed to crosscompile my library on Linux (x86 and ARM), Windows and Android. But now I would like to do it on a custom platform.

The process I need to achieve:

  1. Sourcing my environment (this destroy all previous bash classic environment)
  2. Compile with cmake
  3. Execute what I want

But Cmake is testing for symbols in my custom C/C++ libraries which make my library unable to compile. The errors I have are that cmake some versions of GLIBCXX and CXXABI (no C issues) but not all of them.

Is there a way to make cmake ok with it ?

EDIT:

I tried using:

set(CMAKE_C_COMPILER_WORKS TRUE)
set(CMAKE_CXX_COMPILER_WORKS TRUE)

And with:

include(CMakeForceCompiler)
...
cmake_force_c_compiler(${ENV_PATH}/bin/${CC})
cmake_force_cxx_compiler(${ENV_PATH}/bin/${CXX})

But cmake is still checking for symbols.

回答1:

Without having your environment nor the error message it's not easy to tell the actual root cause but here are two of the common causes and respective fixes:

  1. If you don't have a complete toolchain file created for your custom environment - so CMake can't link a simple test program - you can try the relatively new (version 3.6) global CMake variable named CMAKE_TRY_COMPILE_TARGET_TYPE.

    So just add the following:

    set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
    

    Then CMake would just try to build a static library.

  2. To have only the most common GCC compiler variables set and have only some basic checks, try:

    SET(CMAKE_SYSTEM_NAME Generic)
    

    See CMake Cross Compiling: Setting up the system and toolchain:

    If your target is an embedded system without OS set CMAKE_SYSTEM_NAME to "Generic"

References

  • CMake AMRCC + custom linker
  • cmake cross-compile with specific linker doesn't pass arguments to armlink