2016-03-24 28 views
3

CMAKE ile çapraz derleme ayarlayarak bazı sorunlar yaşıyorum. Kullandığım takım zinciri, cmake dışında mükemmel çalışan yocto'da yaratıldı.CMAKE, derleme işlemi sırasında eksik sysroot eksik

Ben kurulum için bir öğretici aşağıdaki araç zinciri dosyasını takip etmiş

:

SET(CMAKE_SYSTEM_NAME Linux) 
SET(CMAKE_SYSTEM_VERSION 1) 
SET(CMAKE_SYSTEM_PROCESSOR arm) 

# specify the cross compiler 
SET(tools /opt/poky/1.7.1/sysroots/x86_64-pokysdk-linux/usr) 
SET(CMAKE_C_COMPILER ${tools}/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc) 
SET(CMAKE_CXX_COMPILER ${tools}/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc) 

# set sysroot 
SET(CMAKE_SYSROOT /home/sifu/test-yocto/qemuarmdfs) 
#SET(CMAKE_FIND_ROOT_PATH /home/sifu/test-yocto/qemuarm) 

# search for programs in the build host directories 
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 
# for libraries and headers in the target directories 
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) 

Ve aşağıdaki hatayı alıyorum çalışan cmake

The C compiler 
"/opt/poky/1.7.1/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc" 
is not able to compile a simple test program. 

It fails with the following output: 

Change Dir: /home/sifu/Projects/mv/doublepump-single-pump-sw.ss016m21_swapp/cc/CMakeFiles/CMakeTmp 

Run Build Command:/usr/bin/make "cmTryCompileExec4012536451/fast" 

/usr/bin/make -f CMakeFiles/cmTryCompileExec4012536451.dir/build.make 
CMakeFiles/cmTryCompileExec4012536451.dir/build 

make[1]: Entering directory 
`/home/sifu/Projects/mv/doublepump-single-pump-sw.ss016m21_swapp/cc/CMakeFiles/CMakeTmp' 

/usr/bin/cmake -E cmake_progress_report 
/home/sifu/Projects/mv/doublepump-single-pump-sw.ss016m21_swapp/cc/CMakeFiles/CMakeTmp/CMakeFiles 
1 

Building C object 
CMakeFiles/cmTryCompileExec4012536451.dir/testCCompiler.c.o 


/opt/poky/1.7.1/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc 
-O2 -pipe -g -feliminate-unused-debug-types -o 
CMakeFiles/cmTryCompileExec4012536451.dir/testCCompiler.c.o -c 
/home/sifu/Projects/mv/doublepump-single-pump-sw.ss016m21_swapp/cc/CMakeFiles/CMakeTmp/testCCompiler.c 

Linking C executable cmTryCompileExec4012536451 

/usr/bin/cmake -E cmake_link_script 
CMakeFiles/cmTryCompileExec4012536451.dir/link.txt --verbose=1 

/opt/poky/1.7.1/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc 
-O2 -pipe -g -feliminate-unused-debug-types -Wl,-O1 -Wl,--hash-style=gnu 
-Wl,--as-needed CMakeFiles/cmTryCompileExec4012536451.dir/testCCompiler.c.o 
-o cmTryCompileExec4012536451 -rdynamic 

... (A lot of ld errors similar to the one below) 

/opt/poky/1.7.1/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/4.9.1/ld: 
cannot find crtn.o: No such file or directory 

collect2: error: ld returned 1 exit status 

make[1]: Leaving directory 
`/home/sifu/Projects/mv/doublepump-single-pump-sw.ss016m21_swapp/cc/CMakeFiles/CMakeTmp' 

elle yukarıda günlüğüne açıklanan gcc komutu çalıştırırsanız --sysroot =/home/sifu/test-yocto/qemuarmdfs ile benim için çalışıyor. Araç zinciri dosyasına sysroot yolu eklendiğinde neden sysroot bayrağını kullanmıyoruz?

+0

CMake, derleyicinin '--sysroot' seçeneğini desteklediğini algılamak için başarısız görünüyor. Yapılandırılırken 'C derleyici tanımlaması CMake'in GNU çıkışı mıdır? BTW, "CMAKE_C_COMPILER" değişken tanımında "gnueabi-gcc" den önce hata alanlı araç zinciri gösterirsiniz. Bu araç orjinal toolchain dosyanızda yok, değil mi? – Tsyvarev

+0

Yapılandırırken, doğru C derleyicisini algılar 'C derleyici tanımlaması GNU 4.9.1'dir. CMAKE_C_COMPILER'daki alan sadece bir kesme ve yapıştırma sorunuydu, orijinal soruyu düzenledim. – user1178014

+0

Emin değilim, ancak CMUM projesini yapmaya çalıştığınız CMake_C_FLAGS'yi bir şekilde değiştirdi, bu nedenle --sysroot seçeneği yok oluyor. Araç zincirinizle basit "Merhaba dünya" programı oluşturmaya çalışabilir misiniz? – Tsyvarev

cevap

0

Sana CMAKE_C_FLAGS ayarlamanız gerekir düşünüyorum ve ben bu sorunun iki çözümü vardır

include(CMakeForceCompiler) 
+0

Sorunumu çözmüyor, derleyici test komutuna hala bir sysroot eklenmiyor. Ancak, cmake'yi üç kez üst üste çalıştırırsam, testi atlamayı başarabilirim ve biraz daha çalışabilirim. – user1178014

4

gerek Ayrıca

CMAKE_CXX_FLAGS: Ben aşağıdaki kodu kullanabilirsiniz

  1. araç zinciri dosyası:

    # compiler 
    set(CMAKE_C_COMPILER /path/to/arm-none-linux-gnueabi-gcc) 
    set(CMAKE_CXX_COMPILER /path/to/arm-none-linux-gnueabi-g++) 
    # sysroot location 
    set(MYSYSROOT /path/to/sysroots/cortexa7-vfp-neon-telechips-linux-gnueabi) 
    # compiler/linker flags 
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE) 
    set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE) 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE) 
    set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE) 
    # cmake built-in settings to use find_xxx() functions 
    set(CMAKE_FIND_ROOT_PATH "${MYSYSROOT}") 
    set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 
    set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
    set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 
    
  2. İkinci çözüm, toolchain dosyasında CMakeForceCompiler paketini kullanmaktır. Bu farklı görünüyor ama aynı sonucu vardır: çünkü mevcut CKağıt v3.0 beri sadece

    # compiler 
    include(CMakeForceCompiler) 
    cmake_force_c_compiler(/path/to/arm-none-linux-gnueabi-gcc GNU) 
    cmake_force_cxx_compiler(/path/to/arm-none-linux-gnueabi-g++ GNU) 
    # sysroot location 
    set(MYSYSROOT /path/to/sysroots/cortexa7-vfp-neon-telechips-linux-gnueabi) 
    # compiler/linker flags 
    add_definitions("--sysroot=${MYSYSROOT}") 
    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE) 
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE) 
    # cmake built-in settings to use find_xxx() functions 
    set(CMAKE_FIND_ROOT_PATH ${MYSYSROOT}) 
    set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 
    set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
    set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 
    

BTW, CMAKE_SYSROOT değişkeni kullanamazsınız.

+0

Hem çözüm 1 hem de CMAKE_SYSROOT benim için çalışıyor (NXP QorIQ SDK 2.0 PPC64). Çok teşekkür ederim! – Matt