Как создать только объектный файл (*.o) из цели сборки CMake?

Я пытаюсь создать объектный файл с использованием CMake, но я не могу заставить CMake создать что-то кроме полного исполняемого файла. Я в основном ищу результат следующей компиляции (результат будет загружен в цель VxWorks и затем связан):

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

Я пытался изменить свойство OUTPUT_NAME цели, но, похоже, это тоже не помогло.

Я думаю, что я мог бы обойти это с помощью пользовательской команды, но похоже, что я также работаю над хорошими вещами, которые предоставляет CMake.

Спасибо за вашу помощь!

2 ответа

Этот ответ был дан мне в списке рассылки CMake, и он работал как шарм:

Посмотрите на следующее ${CMAKE_SOURCE_DIR}/cpo сценарий:

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

Теперь посмотрите на следующий CMakeLists.txt:

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

Сценарий запуска "cpo" заставляет цель "f" создавать объектные файлы в каталоге, переданном в качестве первого параметра вместо библиотеки; все остальное должно быть как обычно. Ключ доступа скрипта к <OBJECTS> заполнитель, поэтому он может работать с объектными файлами, тогда как фактическая команда ссылки после "-" игнорируется. Таким образом, вы можете использовать все возможности CMake для компиляции и перехвата непосредственно перед установлением связи. ИМО, это довольно чистое решение, которое должно легко адаптироваться к вашим потребностям; Недостатком является то, что использование RULE_LAUNCH_LINK ограничено Makefile генераторы.

Начиная с CMake 3.1, CMake имеет возможность создавать библиотеки объектов:

В OBJECT Тип библиотеки определяет неархивную коллекцию объектных файлов, полученную в результате компиляции данных исходных файлов.

Чтобы создать только объектный файл (без библиотеки или исполняемого файла), используйте этотOBJECT ключевое слово с add_library() команда:

# This will create object.c.o (or object.c.obj on Windows) when built.
add_library(MyObj OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/src/object.c)

Позже вы можете ссылаться на объектный файл (ы) для компиляции в другие библиотеки или исполняемые файлы:

add_library(MyLibrary STATIC $<TARGET_OBJECTS:MyObj> MyClass1.cpp Helpers.cpp)

Я бы пошел пользовательский путь команды. Помните, что вы все равно можете использовать эти объектные файлы для компиляции с последним CMake, если вы установите свойства исходного файла GENERATED и EXTERNAL_OBJECT.

Другие вопросы по тегам