2011-01-22 36 views
9

Tôi đang cố gắng xây dựng một tệp đối tượng bằng CMake, nhưng dường như tôi không thể làm cho CMake xây dựng một thứ gì khác ngoài một tệp thực thi hoàn chỉnh. Tôi về cơ bản tìm kiếm các kết quả của việc biên soạn sau (kết quả sẽ được nạp vào một mục tiêu VxWorks và liên kết sau đó):Làm cách nào để tạo một tệp đối tượng (* .o) từ mục tiêu xây dựng CMake?

$(CC) $(CFLAGS) $(INC_DIRS) -c src/object.c 

tôi đã cố gắng thay đổi thuộc tính OUTPUT_NAME của mục tiêu, nhưng điều đó không' t dường như giúp đỡ, một trong hai.

Tôi nghĩ rằng tôi có thể giải quyết vấn đề này bằng cách sử dụng lệnh tùy chỉnh, nhưng dường như tôi cũng đang làm việc xung quanh những điều tốt đẹp mà CMake cung cấp.

Cảm ơn sự giúp đỡ của bạn!

+0

Tôi tự hỏi tại sao bạn muốn tệp đối tượng. Không thể xây dựng một lib tĩnh với CMake? Nếu cần thiết, một lib tĩnh từ chỉ một tệp nguồn? Ngoài ra, bạn có thể thử liên kết tệp thi hành và "tái sử dụng" các tệp đối tượng đã tạo –

+0

@Andre Một lợi thế sẽ là khắc phục các lỗi biên dịch cho một tệp khi bạn biết cũng có lỗi biên dịch ở nơi khác trong dự án (ví dụ: nếu bạn đang làm việc chặt chẽ với một nhà phát triển khác trên mã chưa sẵn sàng để sử dụng chung) mà không cần chỉnh sửa tệp 'CMakeLists.txt'. –

Trả lời

1

Tôi sẽ đi đường dẫn lệnh tùy chỉnh. Hãy nhớ rằng bạn vẫn có thể sử dụng các tệp đối tượng đó để biên dịch với CMake sau nếu bạn đặt thuộc tính tệp nguồn GENERATED và EXTERNAL_OBJECT.

4

Câu trả lời này đã được đưa ra với tôi trong CMake mailing list và nó làm việc như một nét duyên dáng:

Nhìn vào sau ${CMAKE_SOURCE_DIR}/cpo kịch bản:

#!/bin/sh 
d=$1; shift 
while [ "$1" != "--" ]; do 
    cp $1 $d/$(basename $1); shift 
done 

Bây giờ, nhìn vào CMakeLists.txt sau:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) 
PROJECT(CPO C) 
FILE(WRITE ${CMAKE_BINARY_DIR}/f.c "void f(void){}\n") 
ADD_LIBRARY(f SHARED f.c) 
SET_TARGET_PROPERTIES(f PROPERTIES RULE_LAUNCH_LINK 
    "${CMAKE_SOURCE_DIR}/cpo ${CMAKE_BINARY_DIR} <OBJECTS> --" 
) 

Tập lệnh khởi chạy "cpo" làm cho mục tiêu "f" tạo tệp đối tượng trong thư mục được chuyển vào làm mệnh đề đầu tiên ameter thay vì thư viện; mọi thứ khác sẽ hoạt động như bình thường. Điều quan trọng là quyền truy cập của tập lệnh vào trình giữ chỗ <OBJECTS>, do đó, nó có thể hoạt động trên đối tượng tệp trong khi lệnh liên kết thực tế sau "-" bị bỏ qua. Cách đó , bạn có thể sử dụng tất cả các khả năng của CMake để biên soạn và chặn ngay trước khi liên kết diễn ra. IMO, đó là một giải pháp khá sạch sẽ nên dễ dàng thích nghi với nhu cầu của bạn; các nhược điểm là việc sử dụng RULE_LAUNCH_LINK được giới hạn ở Makefile máy phát điện.

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