2012-10-11 40 views
10

Trong ngắn hạn, tôi đang cố gắng để biên dịch CMake với CMake, và tôi không nghĩ rằng tôi đang liên kết các thư viện một cách chính xác. Những gì tôi muốn làm có thể không thể, nhưng ít nhất tôi cũng muốn biết tại sao nó không thể xảy ra nếu như vậy.Làm thế nào để vượt qua biên dịch CMake cho ARM với CMake

Hệ thống: Máy chủ là Linux box với CPU ARM9 Cavium. Nó hiện đang chạy phiên bản 2.6.24.4 của hạt nhân Linux và Debian 5.0 (Lenny). Máy trạm của tôi là Core i5 đang chạy Ubuntu   12.04 LTS (Chính xác là Pangolin).

Mục tiêu tổng thể của tôi là lấy ROS chạy trên hộp Linux. Tôi phải biên dịch từ nguồn thay vì sử dụng apt từ Debian   6.0 (Bóp) nhị phân yêu cầu hỗ trợ ngón tay cái mà Cavium không cung cấp, và không có nhiều gói cần thiết có sẵn cho Debian   5.0 (Lenny). Tôi đã thực hiện tiến trình cài đặt các thư viện khác nhau cần thiết, nhưng khi tôi bước 1.3.1 và cố gắng chạy CMake, tôi nhận được lỗi

Yêu cầu phải có CMake 2.8 trở lên. Bạn đang chạy phiên bản 2.6.0

Tiếp theo tôi đã cố gắng tải xuống và xây dựng CMake 2.8.8 trên chính hộp Linux, nhưng nó quá nhiều cho hệ thống. Khi không thành công, tôi đã tải xuống chuỗi công cụ được đề xuất trên trang web của nhà sản xuất và sử dụng hướng dẫn biên dịch chéo tại [www.cmake.org/Wiki/CMake_Cross_Compiling] để xây dựng các tệp thi hành CMake. Dưới đây là tập tin toolchain của tôi:

# 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) 

Tuy nhiên, việc sử dụng hệ nhị phân trên Linux hộp cung cấp cho các lỗi

cmake: /usr/lib/libstdc++.so.6: phiên bản 'GLIBCXX_3.4.14 'không tìm thấy (theo yêu cầu của cmake)

đủ chắc, thư viện là không có:

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 

Tôi chưa bao giờ biên dịch trước, nhưng tôi có thể thấy một trong hai kịch bản xảy ra: hoặc nhị phân được tạo với liên kết đến phiên bản glibcxx cao hơn trên máy chủ hoặc toolchain của nhà sản xuất hiện đại hơn hình ảnh của chúng. Tôi không biết cách kiểm tra xem điều gì đang xảy ra hoặc nếu có điều gì khác xảy ra mà tôi không biết.

nỗ lực cuối cùng của tôi tham gia cố gắng tĩnh cross-biên dịch CMake để hy vọng thoát khỏi các lỗi liên kết với

cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain-technologic.cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXE_LINKER_FLAGS_RELEASE="-static" .. 

tôi đã xây dựng sai sót, và nhị phân mà không làm việc một trong hai. Tôi nhận:

FATAL: kernel too old 
Segmentation fault 

Tôi muốn thử cài đặt glibcxx 3.4.14 trên Linux box, nhưng nó không giống như nó có sẵn cho bộ vi xử lý này.

Tôi đã thử tìm kiếm các phụ thuộc CMake hoặc các yêu cầu hệ thống và không thể tìm thấy bất kỳ thứ gì. Tôi cũng đã tìm kiếm cách xây dựng CMake, nhưng hầu hết các tìm kiếm đều tìm cách xây dựng những thứ khác với CMake hơn là xây dựng CMake.

Trả lời

3

Tôi biên dịch chéo rất nhiều cho các thiết bị ARM9 sử dụng CMake và thực sự điều này có vẻ như bạn không liên kết với cùng một libs mà bạn có trên thiết bị đích của mình.Bạn không cần phải tự xây dựng CMake để hoàn thành công việc này, vì nó có hỗ trợ tốt cho việc biên dịch chéo kể từ phiên bản 2.6. Chỉ cần đảm bảo bạn đặt biến CMAKE_FIND_ROOT_PATH thành đường dẫn nơi bạn có bản sao chính xác của hệ thống tệp gốc mà bạn có trên thiết bị đích của mình (với các thư viện và nhị phân được biên dịch trước cho bộ xử lý đích). Điều đó sẽ giải quyết vấn đề của bạn.

Là một phụ trang, tôi thích sử dụng crosstool-ng để xây dựng trình biên dịch chéo của mình. Nó là một công cụ thực sự tốt đẹp giúp bạn xây dựng chúng từ đầu, vì vậy tôi cố gắng so khớp phiên bản trình biên dịch và glibc với các bản gốc được sử dụng để xây dựng hệ thống tập tin gốc (tôi thường bắt đầu với hệ thống tập tin gốc sẵn sàng từ ARMedslack, vì tôi sử dụng Slackware cho hộp phát triển của tôi và ARMedslack cho các mục tiêu ARM của tôi).

+1

Ấn tượng của tôi là cmake không hỗ trợ biên dịch chéo vì dường như nó không bao gồm hỗ trợ chạy nhị phân cho các kiểm tra cấu hình tự động trên nền đích. Liệu tôi có sai? – schily

Các vấn đề liên quan