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.
Ấ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