2012-10-11 38 views
10

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.

cevap

3

CMake kullanarak ARM9 aygıtları için bir çok derleme yapıyorum ve aslında bu, hedef aygıtınızda sahip olduğunuz aynı kitaplarla bağlantı kurmuyor gibi görünüyor.Bunu yapmak için CMake'i kendiniz yapmanıza gerek yok, çünkü sürüm 2.6'dan beri çapraz derleme için iyi bir destek var. CMAKE_FIND_ROOT_PATH değişkenini, hedef aygıtınız üzerinde bulunan kök dosya sisteminin tam bir kopyasına sahip olduğunuz bir yola (yalnızca hedef işlemciler için önceden derlenmiş kütüphaneler ve ikili dosyalar) ayarladığınızdan emin olun. Bu senin problemlerini çözmeli.

Bir sineote olarak, çapraz derleyicileri oluşturmak için crosstool-ng kullanmayı seviyorum. Onları sıfırdan oluşturmanıza yardımcı olan gerçekten güzel bir araçtır, bu yüzden derleyici sürümünü ve glibc'yi kök dosya sistemini (genellikle ARMedslack'dan hazır bir kök dosya sistemi ile başlatmaya alışkın olanlara eşleştirmeye çalışıyorum) Geliştirme kutum için Slackware'i ve ARM hedeflerim için ARMedslack'i kullanın).

+1

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