Kısacası CMake'i CMake ile derlemeye çalışıyorum ve kütüphaneleri doğru şekilde ilişkilendirdiğimi sanmıyorum. Yapmak istediğim şey mümkün olmayabilir, ancak en azından bu durumun neden mümkün olmadığını bilmek isterim.CMake için CMake'i CMake ile derlemek nasıl yapılır?
Sistem: Ana bilgisayar bir Cavium ARM9 CPU'lu Linux box'dur. Şu anda Linux çekirdeğinin 2.6.24.4 sürümünü ve Debian 5.0 (Lenny) sürümünü çalıştırıyor. İş istasyonum Ubuntu 12.04 LTS (Precise Pangolin) çalışan bir Core i5.
Genel hedefim, Linux kutusunda çalışan ROS almaktır. Debian 6.0 (Squeeze) ikili dosyalarının Cavium'un vermediği başparmak desteğine gereksinim duyduğundan ve debian 5.0 (Lenny) için gerekli olan paketlerin çoğundan yararlanamayacağından, apt kullanmak yerine kaynaktan derlemeliyim. Ihtiyaç duyulan çeşitli kütüphaneleri yükleme konusunda ilerleme kaydettim, ancak 1.3.1 adımına geçtiğimde ve CMake'i çalıştırmaya çalıştığımda, hata
CMake 2.8 veya üstü gerekiyor. Şu anda Linux kutusu üzerinde CMake 2.8.8'i indirmeye ve oluşturmaya çalıştım ancak sistem için çok fazla oldu. Bu başarısız olduğunda, üreticinin web sitesinde önerilen araç zincirini indirdim ve CMake çalıştırılabilirlerini oluşturmak için [www.cmake.org/Wiki/CMake_Cross_Compiling] adresindeki çapraz derleme kılavuzunu kullandım. /usr/lib/libstdc++.so.6: versiyon `GLIBCXX_3.4.14
# This one is important
SET(CMAKE_SYSTEM_NAME Linux)
# Specify the cross compiler
SET(CMAKE_C_COMPILER /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc)
SET(CMAKE_CXX_COMPILER /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-g++)
# Where is the target environment
SET(CMAKE_FIND_ROOT_PATH /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/arm-unknown-linux-gnu)
# 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)
Ancak, Linux kutusunda ikili kullanımı hatayı
cmake veriyor: İşte benim araç zinciri dosyasıdır 'bulunamadı (cmake tarafından gerekli) Tabii
, kütüphane yok:
prompt# strings /usr/lib/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBC_2.3
GLIBC_2.0
GLIBC_2.3.2
GLIBC_2.1
GLIBC_2.1.3
GLIBC_2.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
Daha önce hiç çapraz derlemedim, ancak iki senaryodan birini görebiliyorum: ikili, ana makinede daha yüksek bir glibcxx sürümüyle bir bağlantı oluşturdu ya da üreticinin araç zinciri, imajlarından daha modern. Ne olup bittiğini veya bilmediğim bir şey olup olmadığını nasıl kontrol edeceğimi bilmiyorum.
Benim son çaba statik umarım ben yapı hatalarını var
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain-technologic.cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXE_LINKER_FLAGS_RELEASE="-static" ..
ile bağlayan hata kurtulmak için CMake çapraz derlemeye çalışırken katılan ve bu ikili da işe yaramadı. I got:
FATAL: kernel too old
Segmentation fault
Ben Linux kutuyu glibcxx 3.4.14 yüklemeyi deneyin istiyorum, ama bu işlemci için kullanılabilir gibi görünmüyor.
CMake bağımlılıklarını veya sistem gereksinimlerini aramayı denedim ve hiçbir şey bulamadım. CMake'i nasıl kuracağımı da araştırdım, ancak çoğu arama, CMake'in kendisini oluşturmak yerine CMake ile diğer şeyleri nasıl oluşturacağınızı gösteriyor.
Benim izlenimim, cmake, hedef platformda otomatik yapılandırma testleri için ikili dosyaları çalıştırmak için destek içermediği için çapraz derlemeyi desteklememesidir. Yanlış mıyım? – schily