2011-04-27 35 views
36

Xin lỗi vì có nhiều câu hỏi tương tự, nhưng tôi nhận thấy rằng Googling cho truy vấn CMake luôn mang lại các kịch bản tương tự nhưng không giống nhau, các lệnh CMake xung đột và trên!Cách thích hợp để buộc biên dịch 32 bit sử dụng CMake

Tôi cần buộc dự án của tôi xây dựng các tệp nhị phân 32 bit vì tôi phải liên kết với thư viện chỉ có sẵn dưới dạng 32 bit. Tôi được chẩn đoán này dựa trên các thông báo lỗi như:

/usr/bin/ld: i386 architecture of input file `*external-32bit-lib*' is incompatible with i386:x86-64 output 

Từ những gì tôi thu thập, tôi do đó nên sử dụng:

set (CMAKE_CXX_FLAGS "-m32") 

này thay đổi mọi thứ - bây giờ tôi nhận được một số lỗi như:

/usr/bin/ld: i386 architecture of input file `*project-output-lib*' is incompatible with i386:x86-64 output 

VÀ vẫn nhận được cùng một lỗi cho thư viện bên ngoài. Tôi nghĩ rằng điều này là do -m32 tạo gcc tạo các tệp nhị phân 32 bit, nhưng ld vẫn đang cố gắng cho đầu ra 64 bit? Hơn nữa Googling cho vấn đề này đã không cho bất kỳ thành công, vì vậy nếu bất cứ ai có thể xác minh rằng tôi đúng và đưa ra cách chính xác để làm điều này, tôi sẽ rất biết ơn!

Rất cám ơn!

Trả lời

4

Có vẻ như bạn cũng không vượt qua m32 tới LFLAGS, hoặc có các tệp obj cũ bị bỏ qua. Hãy chắc chắn để làm sạch đầu tiên.

Câu hỏi này cũng tương tự như của bạn: cmake, gcc, cuda and -m32

+0

Cảm ơn -đó cũng có thể là trường hợp - nhưng làm thế nào sẽ Tôi làm điều đó mặc dù CMake? Và đây có phải là cách hợp lý nhất hoặc thích hợp để làm điều đó không? Tôi đã làm sạch btw :) – jazzbassrob

+0

Cập nhật câu trả lời. Xem liên kết. Tôi có nghĩa là làm sạch bàn tay của bạn, bạn đang bẩn :) –

+0

Chúc mừng, nhưng tiếc là liên kết dường như không giúp đỡ. Đặt LDFLAGS dường như không có tác dụng ... – jazzbassrob

5

CMAKE_CXX_FLAGS chỉ ảnh hưởng đến ++ biên dịch C. Bạn cũng có thể phải đặt cờ cho trình biên dịch C:

set (CMAKE_C_FLAGS "-m32") 
3

Sử dụng TRY_RUN lệnh bằng nguồn sau đây.

size.cpp:

#include <cstdlib> 

int main(int argc, char** argv) 
{ 
    size_t size = sizeof(void*); 
    if (size == 4) 
    return 0; 
    return 1; 
} 

CMakeLists.txt:

TRY_RUN(RUN_RESULT_VAR COMPILE_RESULT_VAR ${your_temp_dir} size.cpp RUN_OUTPUT_VARIABLE IS_64_SYSTEM) 
IF(IS_64_SYSTEM) 
    MESSAGE(FATAL_ERROR "64 compiling not allowed!") 
ENDIF(IS_64_SYSTEM) 

Nó sẽ làm việc trên tất cả các trình biên dịch chuẩn.

33

Nếu bạn muốn biên dịch và liên kết cho 32 bit sử dụng cmake này sử dụng để tạo các thư viện và mã nhị phân:

Tạo thư viện:

add_library(mylib SHARED my_source.c) 
set_target_properties(mylib PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32") 

tạo thực thi:

add_executable(mybin sources.c) 
set_target_properties(mybin PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32") 

Hy vọng điều này giúp,

13

Ngay cả khi điều này có vẻ như là công việc phụ, tôi tin rằng một soluti thích hợp trên là sử dụng tệp toolchain trong trường hợp này.Một cái gì đó như:

# the name of the target operating system 
set(CMAKE_SYSTEM_NAME Linux) 

# which compilers to use for C and C++ 
set(CMAKE_C_COMPILER gcc) 
set(CMAKE_C_FLAGS -m32) 
set(CMAKE_CXX_COMPILER g++) 
set(CMAKE_CXX_FLAGS -m32) 

# here is the target environment located 
set(CMAKE_FIND_ROOT_PATH /usr/i486-linux-gnu) 

# adjust the default behaviour of the FIND_XXX() commands: 
# search headers and libraries in the target environment, search 
# programs in the host environment 
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 

Sau đó sử dụng chỉ đơn giản là:

$ cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake /path/to/source 

Phần quan trọng ở đây là ngay bây giờ có thể chỉ định đường dẫn thư mục gốc (CMAKE_FIND_ROOT_PATH) mà nên được sử dụng để tìm kiếm bên thứ ba lib. Thật vậy trình biên dịch của bạn có thể không đủ thông minh để biết nơi tìm kiếm một thư viện X86 Qt trên một hệ thống x86_64.

Có tệp chuỗi công cụ cho phép người dùng chỉ định một tệp khác trên cơ sở trình biên dịch ngang và bạn có thể tinh chỉnh tùy chọn khi biên dịch trong 32 bit từ môi trường cửa sổ. Ngày nay, đây là công việc phụ kể từ khi biên dịch 32 bit từ một hệ điều hành Linux x86_64 là khá nhỏ, nhưng giải pháp này sẽ làm việc cho các thiết lập kỳ lạ hơn khác.

Để biết thêm thông tin về tập tin toolchain, người ta có thể kiểm tra ví dụ:

+3

Một tệp chuỗi công cụ có thể hơi nhiều khi 'cmake/path/to/source -DCMAKE_CXX_FLAGS = -m32 -DCMAKE_C_FLAGS = -m32' có thể thực hiện, nhưng hai cách này là những cách thích hợp duy nhất xử lý tình huống này. CMakeLists.txt không được chứa loại "thông tin" này. Trừ khi OP muốn ngăn chặn một biên dịch 64-bit từ bao giờ xảy ra. – rubenvb

+0

@rubenvb như được giải thích trong bài đăng của tôi, bạn vẫn cần 'CMAKE_FIND_ROOT_PATH' để giúp cmake xử lý một cái gì đó như' find_package (Qt) ' – malat

+0

sử dụng kỹ thuật này và cmake 3.9.3, CMAKE_CXX_FLAGS được xác định trong chuỗi công cụ KHÔNG được truyền trong các dự án con lần đầu tiên Tôi đang tạo thư mục xây dựng. Nhưng hành vi thay đổi nếu bạn chạy lần thứ hai lệnh để tạo thư mục xây dựng mà không xóa thư mục xây dựng hiện có !!! Tôi không chính xác biết nếu đây là một tính năng bình thường hay không ... Để giải quyết vấn đề, tôi định nghĩa CMAKE_CXX_FLAGS như sau trong file toolchain: 'set (CMAKE_CXX_FLAGS" $ {CMAKE_CXX_FLAGS} -m32 "CACHE STRING" c + + flags ") ' – sancelot

1

tôi đã sử dụng cách tiếp cận malat và tạo ra một tập tin toolchain.

Tôi có một tệp Toolchain hoạt động trên một số distro Linux, có lẽ nó sẽ cung cấp cho bạn nguồn cảm hứng. Nó có thể làm việc cho bạn như là, hoặc bạn có thể cần hacks xấu xí khác để có được kịch bản cmake khác mà bạn dựa vào để làm việc hoặc w/e:

https://github.com/visualboyadvance-m/visualboyadvance-m/blob/master/cmake/Toolchain-cross-m32.cmake

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