2016-07-08 2 views
6

Я разрабатываю проект на C++, который будет заключен в более крупный.Скомпилировать один файл в проекте CMake?

Я видел, что в большом проекте (это приложение Qt, и оно создается из qmake). Я могу скомпилировать один файл из командной строки linux, просто введя относительный путь к определенному файлу в качестве аргумент.

С другой стороны, я использую CMake для своего собственного проекта. Когда я изменяю код для единицы компиляции, и мне нужно изменить его заголовочный файл, мне приходится долго ждать, чтобы скомпилировать его зависимости, а затем его собственный исходный файл. Но есть некоторые ситуации, в которых я бы предпочел проверить, может ли исходный код в файле * .cc компилироваться без ошибок.

Есть ли способ создать Makefile из CMake, как это делает qmake? Переключение на qmake больше не является вариантом.

+0

Try 'сделать help' на текущий CMake сгенерированный Makefile. Я уверен, что расскажу, как построить только один объектный файл. – John

ответ

3

Нет, CMake не предлагает встроенную поддержку для компиляции отдельных файлов.

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

3

Не из коробки. CMake не раскрывает эти «внутренние» правила makefile в главном make-файле.

Вы можете сделать это, только если учесть, какая структура файла использует CMake внутри. Вы можете, например, для компиляции одиночных .obj файлов с помощью CMake генерироваться Makefiles называют

make -f CMakeFiles/myProg.dir/build.make CMakeFiles/myProg.dir/main.cc.obj 

, когда у вас есть что-то вроде

cmake_minimum_required(VERSION 3.1) 

project(myProg CXX) 

file(WRITE "main.cc" "int main()\n{\nreturn 0;\n}") 
add_executable(myProg main.cc) 
6

Вы не должны добавлять дополнительные пользовательские цели для ваших сценариев CMake, как Makefiles порождена CMake уже содержат .o цели для каждого .cc-файла. Например. если у вас есть исходный файл с именем mySourceFile.cc, в вашем каталоге сборки будет Makefile, который определяет целевой объект с именем <Some Path>/mySourceFile.cc.o. Если вы введете cd в свой каталог сборки, вы можете использовать grep или ack-grep, чтобы найти Makefile, который определяет эту цель, затем cd в каталог Makefile и его создать.

E.g. предположим, что команда ack-grep mySourceFile.cc.o печатает что-то вроде:

foo/bar/Makefile 
119:x/y/z/mySourceFile.o: x/y/z/mySourceFile.cc.o 
123:x/y/z/mySourceFile.cc.o: 
124: # recipe for building target 

Тогда вы можете построить mySourceFile.cc.o, выполнив:

cd foo/bar && make x/y/z/mySourceFile.cc.o