Linux нет правила для сборки цели

Обновлено: 07.07.2024

Иногда стандартная последовательность для компиляции программы не работает. Она начинает выводить различные ошибки и не компилирует программу. Что в таком случае делать? В этой статье описано как избавиться от множества часто встречающихся ошибок.

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

Мы можем разделить ошибки на три категории:

Ошибки при выполнении команды ./configure

Ошибки при выполнении команды make

Ошибки при выполнении команды make install

Очевидно, что ошибки при выполнении команды ./configure, возникают во время выполнения скрипта конфигурации, ошибки при выполнении команды make возникают во время выполнения команды make, а ошибки при выполнении команды make install, соответственно, возникают при выполнении команды make install. Далее будет представлен лист типичных ошибок и способ их решения, разделенный на эти три категории.

Ошибки при выполнении команды ./configure

Следующий список содержит некоторые общие ошибки, которые может выдать каманда ./configure. Ошибки отсортированы по частоте возникновения. Сначала наиболее часто встречающиеся. Вещи между ( и ) являются опциональными, они могут не появлятся. OR, выделенное жирным курсивом означает, что несколько ошибок имеют одно решение. Текст между < и > показывает тип строки, которая должна появиться в этом месте.

Это обычно означает что -dev или -devel версия пакета ,который называется <somename> не установлена у вас на компьютере. Используйте менеджер пакетов вашего дистрибутива (или любой другой способ найти и установить пакет), чтобы найти пакет <somename> и установить его, если это возможно, -dev или -devel версию. Если -dev или -devel версия уже установлена, или её не сущечтвует, посмотрете на версию уже установленной. Она достаточно новая? Если она ниже, чем <someversion>, попробуйте обновить пакет. Если обновить пакет не представляется возможным, вы можете попробовать скомпилировать более мтарую версию программы. Более старые версии обычно используют более старые версии библиотек и программ, необходимых для компиляции.

Конфигурационный скрипт не может найти .h файл, необходимый для компиляции. Эта ошибка похожа на предыдущую, в которой необходимо установить -dev или -devel версию пакета. Однако, обычно не понятно какой пакет нужно установить для решения этой проблемы, так как <somename> может быть очень общим названием. Попробуйте поискать в интернетет <somename>.h, чтобы узнать в каком пакете этот файл находится, а затем установите этот пакет (и его -dev или -devel версия, если это возможно) с помощью менеджера пакетов вашего дистрибутива.

Вы используете для установки компилятор gcc, А переменная окружения CC отсутствует или не установлена. Убедитесь, что пакет gcc установлен, используя менеджер пакетов вашего дистрибутива. Если этот пакет не установлен, установите его. Если он установлен, попробуйте выполнить следующую команду:

Если это помогло, вы можете добавить эту команду в /etc/profile (это файл, содержащий команды, которые выполняются когда пользователь входит в систему) и тогда вам не придется набирать её снова.

Ваш пакет g++ отсутствует или поврежден. Используйте Используйте менеджер пакетов вашего дистрибутива (или любой другой способ найти и установить пакет), чтобы найти пакет g++ и установить его. Не забудьте, что в некоторых дистрибутивах этот пакет называется не g++. Fedora, например, использует название gcc-c++ в соем репозитарии yum. Если вы не можете найти g++, попробуйте поискать c++, cpp или gcc.

Эта ошибка вызвана странным "багом" в некоторых версиях библиотеки libtool, которая заставляет конфигурационный скрипт проверять все компиляторы поддерживающиеся libtool. Наиболее простое решение - установить g++.

Ошибки при выполнении команды make

Если вы компилируете программу с использованием gcc 4 (используйте gcc -dumpversion чтобы это выяснить), попробуйте использовать более старые версии компилятора. Сначала убедитесь, что у вас установлена более старая версия. Обычно это можно узнать, использовав следующую команду:

Если она вернет что-то вроде этого:

То можете использовать команды gcc32, чтобы скомпилировать программу в более ранними версиями gcc. Если команда не вернет подобной строки, то используя менеджер пакетов вашего дистрибутива, найдите и установите более ранние версии gcc (обычно они называются compat-gcc или gcc-<versionnumber>). После установки, вам должна быть доступна альтернативная версия gcc. Её можно найти используя команду ls. Заставить команды ./configure, make и make install использовать более старую версию gcc можно так:

]$ CC="/usr/bin/gcc32" ./configure
[rechosen@localhost

]$ CC="/usr/bin/gcc32" make
[rechosen@localhost

]$ CC="/usr/bin/gcc32" make install

Конечно путь /usr/bin/gcc32 надо заменить на тот, по которому у вас находится альтернативная версия gcc.

Иногда ошибки могут вызваны простым "багом" программы. Попробуйте скачать последнюю версию программы (используя её cvs, svn или другой репозитарий, или скачав последний снимок) и скомпилируйте её, возможно эта ошибка уже исправлена.

Ошибка при выполнении комадны make может быть также вызвана неправильной версией необходимой библиотеки или программы. Эта проблема часто встречается для очень новых или очень старых пакетов. Проверьте зависимости пакета (они обчно написаны на сайте программы) и сравните номера версий с версиями, установленными у вас на компьютере (их обчно можно посмотреть, используя менеджер пакетов вашего дистрибутива). Если номер версии в вашей системе больше того, которые написан на сайте, возможно вы пытаетесь скомпилировать очень старый пакет. Если вам дейсвительно необходимо его скомпилировать, попробуйте установить более старые версии зависимых пакетов.Как бы то небыло, обычно лучше поискать другой способ установки этого пакета или поискать альтернативу. Если номер версии в системе меньше, чем на сайте, вы можете попробовать обновить соответствующий пакет.Вы можетепопробовать обновить требуемую библиотеку или скомпилировать более старую весию программы.Так же проверьте, может уже есть этот пакет, скомпилированный для авшего дистрибутива. Его установка, обычно, проще, чем исправление ошибок компиляции.

Другая вещь, которую стоит попробовать - это поиск специфической ошибки в интернете. Если вы не нашли ничего полезного, попробуйте убрать такие вещи, как номер строки (он может измениться с новой версией), номер версии (его можно заменить звездочкой, если он содержится в названии программы) и специальные символы, такие как кавычки, так как они влияют на поисковый сервис. Обычно можно найти много информации в листе рассылок. Иногда выходит патч, который исправляет ошибки в исходном коде. Его можно применить слудеющим образом:

Ошибки при выполнении команды make install

Эти ошибки обычно легко понять, но я все равно про них напишу. Есть два наиболее частых случая, почему команда make install возвращает ошибку:

У вас нет прав пользователя root. Попробуйте выполнить команду make install, используя команду sudo, или станеть пользователем root, используя команду su. Команда sudo применяется следующим образом:

]$ sudo make install

Она спросит пароль; обычно используется собственный пароль или пароль пользователя root. Вы можете испльзовать команду su, чтобы стать польpователем root:

Эта команда тоже спросит пароль, но в данном случае наобходим именно пароль пользователя root. После того, как вы стали пользователем root, просто выполните команду make install.

Пакет, который вы только что скомпилировали не имеет команды установки. В этом случае вам надо скопировать скомпилированный бинарный файл в директорию bin вручную. Если вы выполните команду ls в директории исходного кода, исполняемый файл должен быть светло зеленого цвета. Его надо скопировать в /usr/bin (или, если хотите, в /usr/local/bin) следующей командой:

]$ cp <executablefile> /usr/bin

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

Другие проблемы

Вот список некоторых других возможных проблем и их решения:

Все проходит хорошо, но когда я набираю имя программы, которую только что установил, bash говорить, что не может её найти. Это обычно происходит из-за того, что make install устанавливает все в /usr/local или in /opt/<packagename>. Посмотрите на вывод команды make install: куда скопированы файлы? Попробуйте добвавить эту директорию в переменную PATH (следующий пример приведен для пакета, установленного в /usr/local):

Вам надо заменить /usr/local/bin на директорию, в которой установлены исполняемые файлы вашего пакета. Если это помогло, добавьте эту строку в /etc/profile, чтобы вам не пришлось набирать её каждый раз. Кстати, вы можете контролировать место, куда установится пакет, указав следующую опцию, когда запускаете конфигурационный скрипт:

Измените /usr на директорию, в которую хотите установить пакет. Не забудьте, что вы устанавливаете только префикс; бинарные файлы установятся в свою поддиректорию, библиотеки в свою, заголовочные файлы в свою и т.д. Например при использовании указанного префикса, бинарные файлы будут установлены в /usr/bin.

Я хочу установить очень старую версию пакета, но я не могу найти исходный код в интернете. У вас еще остается маленький шанс. Попробуйте найти rpm файл пакета той версии, которую вы хотите и скачайте соответствующий src rpm файл. Распаковать его можно следующим образом:

]$ rpm2cpio <pmfile> | cpio -idv

Теперь можно использовать исходный код, извлеченный из rpm файла.

Финальные слова

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

все собирается, запускается. однако make clean и make install не работают:

, дескать, "нет правила для сборки цели clean". Что не так?

версия make: GNU Make 3.82

1 ответ 1

программа gnu/make, если ей не указан файл с правилами, пытается использовать такие имена файлов (именно в таком порядке): GNUmakefile , makefile и Makefile .

в том каталоге, где вы запускаете программу gnu/make, вероятно, и присутствует файл с одним из перечисленных выше имён.

а файл с именем mkf не используется (по умолчанию).

для того, чтобы указать конкретный файл, можно передать программе gnu/make опцию -f имя_файла . например:

su -c make install

Иногда, чтобы освободить место на диске, или при перекомпиляции требуется удалить результаты предыдущей сборки – объектные файлы (*.o), двоичные файлы программы и другие временные файлы. Для этого нужно выполнить команду:

Эта команда удалит вышеуказанные файлы. Операция затронет только файлы в каталоге исходников, т.е. уже установленные в системные каталоги при помощи команды make install файлы затронуты не будут.

Если вы хотите привести исходники программы к первоначальному состоянию, т.е. удалить не только двоичные файлы, но и config.log, Makefile и другие, созданные скриптом ./configure, введите:

Теперь для повторной сборки программы вам нужно будет снова запустить ./configure.

И наконец, чтобы отменить действие команды make install, т.е. удалить установленную программу, нужно, как нетрудно догадаться, выполнить:

Как и для make install, этой команде могут потребоваться права root.

make: *** Не заданы цели и не найден make-файл. Останов.

Например, вы можете получить список файлов типа Makefile.linux, Makefile.hpux, Makefile.macosx. Это значит, что для компиляции одной и той же программы на разных платформах автор предусмотрел несколько вариантов Makefile. Другой вариант – если вы загрузили исходный код из CVS, файл будет назван Makefile.cvs. Учтите, что Makefile.in и Makefile.am не относятся к Makefile, это всего лишь заготовки для создания Makefile. Итак, если вы нашли нужный Makefile, запустите make с ключом -f, например, так:

make -f Makefile.cvs

АНТОН ИВАНОВ

Работа с утилитой make

В статье на конкретных примерах рассматриваются варианты применения утилиты make как пользователями, так и разработчиками.

make для пользователей

Начнём с самого начала. Самое главное, но далеко не последнее применение утилиты make – это автоматическая сборка (компиляция) программ. И хотя большинство программ для Linux могут быть получены в двоичном (то есть в скомпилированном виде, в пакетах .deb, .tgz или .rpm), в процессе работы с Linux вам наверняка потребуется собрать программу самостоятельно из исходного кода.

Итак, вы загрузили архив с исходниками программы, скорее всего в виде tarball, т.е. сжатого tar-архива. Распространены две программы сжатия: gzip и bzip2 (последняя сжимает файлы лучше, но медленнее). Имена файлов таких архивов оканчиваются соответственно на .tar.gz (или .tgz) и tar.bz2 (или .tbz). Распакуйте архив командой:

tar xzvf имя_файла.tar.gz

tar xjvf имя_файла.tar.bz2

Другой вид распространения исходных кодов – в пакетах .src.rpm, в этом случае просто установите такой пакет как обычно, и исходники появятся в каталоге /usr/src/RPM/SOURCES.

Первым этапом в сборке программы является настройка командой ./configure (она определяет параметры системы и создает Makefile, наиболее подходящий для данной конфигурации), но нас интересует следующий шаг – сама компиляция при помощи команды make.

В большинстве случаев для сборки программы достаточно ввести только саму команду make, без каких-либо дополнительных параметров. По мере выполнения на экран будут выводиться команды, исполняемые при компиляции. Процесс этот может быть довольно долгим, в зависимости от скорости вашего компьютера.

Когда управление будет возвращено оболочке, т.е. появится приглашение ввода команд, внимательно просмотрите последние несколько строк, выведенных командой make. Если среди них есть «Error», или «Ошибка», это значит, что программа не скомпилировалась. Это может быть вызвано множеством причин: отсутствием каких-либо пакетов, ошибкой в программе, отсутствием прав записи в какой-либо файл или каталог и т. д. Еще раз внимательно перечитайте файлы README и INSTALL в каталоге с исходниками программы.

Обратите внимание, что в процессе компиляции может появляться множество предупреждений («warnings»). Они обычно вызываются небольшими несоответствиями стандарту Cи; скорее всего, они не приведут к ошибке компиляции.

Если вы сомневаетесь, нормально ли скомпилировалась программа, сразу же после завершения работы make выполните команду:

На экран будет выведен код возврата программы. Он показывает, успешно ли завершилось выполнение программы. Если он равен нулю, то всё нормально, если отличен от нуля – произошла ошибка.

После команды make можно указывать цели сборки. Цель – это то, что нужно сделать программе make. В большинстве случаев, если цель не указана, то происходит сборка программы. Если выполнить команду:

то произойдет установка программы. Обратите внимание, что при выполнении этой команды файлы скорее всего будут скопированы в каталоги, в которые доступ на запись для простых пользователей закрыт. Поэтому вам нужно либо получить права суперпользователя (вы ведь не работаете постоянно под root, правда?), либо использовать программу su:

su -c make install

Иногда, чтобы освободить место на диске, или при перекомпиляции требуется удалить результаты предыдущей сборки – объектные файлы (*.o), двоичные файлы программы и другие временные файлы. Для этого нужно выполнить команду:

Эта команда удалит вышеуказанные файлы. Операция затронет только файлы в каталоге исходников, т.е. уже установленные в системные каталоги при помощи команды make install файлы затронуты не будут.

Если вы хотите привести исходники программы к первоначальному состоянию, т.е. удалить не только двоичные файлы, но и config.log, Makefile и другие, созданные скриптом ./configure, введите:

Теперь для повторной сборки программы вам нужно будет снова запустить ./configure.

И наконец, чтобы отменить действие команды make install, т.е. удалить установленную программу, нужно, как нетрудно догадаться, выполнить:

Как и для make install, этой команде могут потребоваться права root.

Например, вы можете получить список файлов типа Makefile.linux, Makefile.hpux, Makefile.macosx. Это значит, что для компиляции одной и той же программы на разных платформах автор предусмотрел несколько вариантов Makefile. Другой вариант – если вы загрузили исходный код из CVS, файл будет назван Makefile.cvs. Учтите, что Makefile.in и Makefile.am не относятся к Makefile, это всего лишь заготовки для создания Makefile. Итак, если вы нашли нужный Makefile, запустите make с ключом -f, например, так:

make -f Makefile.cvs

Вы начали компилировать программу, но вдруг. Ошибка 1. Что делать? Для начала еще раз перечитайте документацию к программе. Если ситуация не прояснилась, попробуйте запустить make с ключом -i, означающим «игнорировать все ошибки»:

Теперь давайте заглянем внутрь Makefile. Попробуем его немного поизменять. Откройте в своем любимом текстовом редакторе, например, Makefile из исходного кода Linux (если у вас установлены исходники Linux, то это /usr/src/linux/Makefile). Посмотрите на самые первые строчки:

Это переменные, используемые в дальнейшем при сборке ядра. Поменяв их значения, например, так:

и пересобрав ядро, вы можете потом хвастаться перед друзьями командой uname -r, которая будет показывать доставшуюся вам сверхсекретную версию ядра (3.0.0.topsecret).

Если же говорить о практическом применении, то иногда вам может потребоваться немного изменить Makefile, скажем, для того, чтобы исключить компиляцию какой-либо программы из большого пакета утилит. Пример: вы загрузили свежую версию утилит KDE (пакет kdeutils). Но какая-то программа из этого пакета никак не компилируется, и make -i не помогает. Допустим, программой, на которой происходит ошибка, является kedit. Откройте kdeutils/Makefile. Теперь просто найдите все встречающиеся слова «kedit» (в редакторе vim для этого введите /kedit) и удалите их:

TOPSUBDIRS = kdf kedit kfloppy

Это список подкаталогов с исходным кодом различных программ. Утилита make по очереди заходит в каждый из них и выполняет Makefile, находящийся в этом подкаталоге. Удалите слово kedit, сохраните файл и снова запустите make. Вы увидите, что сборка kedit будет пропущена.

make для разработчиков

Пока ваша программа состоит из одного файла, проще всего компилировать ее командой:

Теоретически можно и всю программу поместить в один файл. Однако принято разделять код на несколько файлов, в больших проектах их десятки и сотни.

Для примера создадим простую программу на C, вычисляющую квадрат числа. Она будет состоять из двух файлов: главного (main.c) и kvadrat.c, содержащего функцию возведения в квадрат. Ниже приведен исходный код этой программы:

printf("Program calculates the square of a number. ");

printf("Please enter an integer: ");

printf("%d x %d = %d ", a, a, rslt);

return number * number;

Заранее скажу, что и эту программу можно скомпилировать довольно быстро без помощи Makefile командой cc *.c. Но мы все будем делать «по-правильному».

Сборка программы у нас будет разбита на два этапа: препроцессинг и компиляция, т.е. преобразование исходного кода в объектный код (файлы *.o), и сборка и линковка, т.е. объединение .o-файлов в один исполняемый файл и подключение динамических библиотек. Первый этап выполняется командой «gcc -c -o», второй – «gcc -o». gcc при запуске пытается осуществить все этапы сборки программы; параметр -c означает, что нужно только получить объектные файлы.

Итак, как вы уже знаете, утилита make ищет файл с именем Makefile. Создайте его.

Makefile состоит из набора т.н. правил. Они, в свою очередь, состоят из трех частей: цель (то, что должно быть получено в результате выполнения правила); зависимости (что требуется для получения цели); команды, которые должны быть выполнены для сборки цели. Общий синтаксис правил таков:

цель: зависимость_1 зависимость_2 зависимость_N

Давайте рассуждать логически. Нам требуется собрать программу, пусть имя ее исполняемого файла будет «kv». У нас два файла с исходным кодом, каждый из них должен быть преобразован в .o-файл (принято называть объектные файлы так же, как и исходные файлы, но с расширением .o; в нашем случае это будут main.o и kvadrat.o). Именно они необходимы для сборки исполняемого файла, значит, они являются зависимостями. Ну а про команды уже было сказано выше. Итак, Makefile должен выглядеть так:

kv: main.o kvadrat.o

cc -o kv main.o kvadrat.o

cc -c -o main.o main.c

cc -c -o kvadrat.o kvadrat.c

Здесь нужно обратить внимание на несколько особенностей:

Для понятности я опишу логику работы утилиты make с этим Makefile: сначала проверяется наличие файла main.o – первой зависимости у цели kv. Если его нет, то выполняется его компиляция, если есть, то проверяется, не был ли изменен файл main.c с момента последней его компиляции (вот зачем нужно указывать main.c как зависимость для main.o!). Если он был изменен, он компилируется заново. Если же он не был изменен, то просто пропускается; таким образом при повторной сборке можно значительно сократить затрачиваемое время.

Далее та же проверка происходит и для kvadrat.o, и как только будут получены main.o и kvadrat.o, включающие все изменения в исходном коде, начнется сборка исполняемого файла.

Итак, сохраните Makefile и запустите make. Должны появиться два .o-файла и сам исполняемый файл kv. Для проверки запустите его:

Теперь давайте добавим в Makefile еще одну цель: clean. При вводе make clean должны удаляться три полученных в результате компиляции файла. Допишите в конец Makefile такие строки:

Сохранив Makefile, введите make clean. Все три двоичных файла будут удалены.

Теперь создадим последнюю цель – install. Она будет служить для копирования двоичного файла программы в системный каталог.

Добавьте в конец Makefile следующие строки:

install -D -m 544 kv /opt/kv/kv

Запустите make install, затем введите команду:

чтобы убедиться в правильности установки.

После параметра -m у команды install указываются права доступа, предпоследним параметром – файл, который нужно скопировать, последним параметром является каталог назначения с именем файла (т.е. исполняемый файл можно установить под другим именем, введя, например, /opt/kv/program_name в качестве последнего параметра).

Теперь поговорим о переменных. Представьте, что вам нужен Makefile для более сложного проекта, где в каталог назначения копируется одновременно несколько файлов. Вы укажете путь установки для каждого из них, например, так:

install /opt/kv/file2 и т.д.

Но вдруг вам потребовалось изменить путь установки. Вам придется поменять параметр у каждой команды. И хотя это можно сделать относительно быстро при помощи команды «заменить» в текстовом редакторе, проще всего определить переменную один раз в начале Makefile и потом использовать ее (при необходимости изменяя только ее значение). Добавьте в начало Makefile определение переменной:

И затем измените команду install таким образом:

install -D -m 544 kv $(INSTALL_PATH)/kv

На что здесь нужно обратить внимание:

  • в объявлении переменной указывается просто ее имя, а когда вы ее используете – знак $ и имя;
  • если имя переменной состоит более чем из одного символа, при ее использовании нужно заключать такое имя в скобки;
  • нужно или нет ставить косую черту в значении переменной (/opt/kv/ или /opt/kv)? Ответ: лучше перестраховаться и поставить. Как вы можете заметить, в команде установки косая черта идет подряд дважды: /opt/kv//kv (одна косая черта из значения переменной, другая – из записи $(INSTALL_PATH)/kv). Это не приведет к ошибке – вы можете поставить символ «/» хоть десять раз подряд. А вот если забудете поставить ее хотя бы один раз, то результаты, ясное дело, будут отличаться от ожидаемых.

Теперь рассмотрим такой момент: допустим, нужно выполнить некоторую команду и присвоить переменной выводимое этой командой значение. Например, если для разных версий ядра Linux существуют разные версии вашей программы. В таком случае при выполнении установки программы на системе с ядром 2.6.1 можно установить ее в каталог /opt/kv/2.6.1/, а если система запущена с ядром 2.4.24 – в каталог /opt/kv/2.4.24/. Версию ядра можно определить при помощи команды uname -r (попробуйте выполнить ее, чтобы посмотреть вашу версию ядра). Вопрос в том, как же передать полученное значение переменной? Очень просто:

INSTALL_PATH = /opt/kv/`uname -r`/

Теперь установка будет производиться в каталог /opt/kv/версия_вашего_ядра/. Обратите внимание на косые кавычки: они вводятся при помощи Shift+

(крайняя левая клавиша в ряду кнопок с цифрами).

backup: backup/1 backup/2 backup/3

Домашнее задание для вас: разберитесь, как работает этот пример, а к первому добавьте цель uninstall, так, чтобы при выполнении команды make uninstall установленная программа удалялась.

man make. Аргумент -C меняет директорию, в которой ищется Makefile, в данном случае это директория с исходниками ядра, в которой валяется Makefile, собирающий как модули так и само ядро(/usr/src/linux/Makefile). "modules" - цель сборки в Make-файле, в данном случае отвечает за сборку модулей ядра.

Тоже самое что и SUBDIRS, аргумент передаваемый Makefile-у, в данном случае указывает директорию где лежит Makefile твоего модуля.

/usr/src/linux/Documentation/kbuild/modules.txt:
make -C $KDIR SUBDIRS=`pwd`
Same as M=. The SUBDIRS= syntax is kept for backwards compatibility.

Цитата
Marco пишет:
И вот исчо. я кладу Makefile и сам hello.c в корень сорцов (естественно оригинальный Makefile переобозвал) - правильно делаю?

Эээ в корень каких сорсов? Ядра? Так делать неправильно.Нужно создать отдельную папку(у себя в $HOME, или где еще) куда кладешь исходники модуля и свой Makefile, а затем собираешь указанной командой

Например, "make -C /usr/src/linux/ M=/home/user/module modules" либо просто "make -C /usr/src/linux/ M=$PWD modules" если текущая директория - /home/user/module с исходниками твоего модуля.

Когда собираешь ядро, надо запустить команду make modules (если собирал, то знаешь).
Так вот здесь ты делаешь абсолютно то же самое, только указываешь мейкфайлу ядра, что исходники надо брать из директории твоего модуля. Эта хрень есть только в 2.6

не. нифига. пишет, что нет правила для сборки цели. чё-то неправильно в Makefile написал. тама вроде оч важен формат текста. пробовал и табуляции и пробелы..по-разному. нифига не получается.
Дальше Makefile не продвинулся.
вот у меня он какой:
obj-m<табуляция>:=<пробел>mymodule.o
Сотрел в оригинальном - вроде так
Может что-то исчо тама должно быть? Прежде всего, забей на пробелы и табуляции. Пиши все вместе
Попробуй obj-m+=tvoi_modul.o
Цитата
Marco пишет:
не. нифига. пишет, что нет правила для сборки цели. чё-то неправильно в Makefile написал. тама вроде оч важен формат текста. пробовал и табуляции и пробелы..по-разному. нифига не получается.

Проверь наличие ядерного Makefile в пути, который указан с параметром -C. Твой конфиг Makefile правилен. Скорее всего у тебя сейчас просто неверно указан путь к ядреному Makefile-у(в Debian нужно использовать /usr/src/kernel-headers-xxx/Makefile). Обычно /lib/modules/`uname -r`/build правильно указывает на корректный путь к директории с ядерным Makefile для текущего ядра.

Поэтому попробуй собирать так:


Если kernel-headers установлены, то все должно собираться, что и было продемонстрировано выше.

/module$ ls
mymodule.c
user@host:

static int hello_init(void)
printk(KERN_ALERT "Hello World\n");
return 0;
>

static void hello_exit(void)
printk(KERN_ALERT "Goodbuy World\n");
>

$ ls /usr/src/linux-2.6.11/
arch Documentation init MAINTAINERS net security
COPYING drivers ipc Makefile README sound
CREDITS fs kernel Makefile1 REPORTING-BUGS usr
crypto include lib mm scripts
user@host:

/module$ cat /usr/src/linux-2.6.11/Makefile
obj-m+=mymodule.o
user@host:

/module$ make -C /usr/src/linux-2.6.11/ M=$PWD modules
make: Entering directory `/usr/src/linux-2.6.11'
make: *** Нет правила для сборки цели `modules'. Останов.
make: Leaving directory `/usr/src/linux-2.6.11'

/module$ ls -l /lib/modules/2.6.11/build
lrwxrwxrwx 1 root root 21 2006-04-23 18:49 /lib/modules/2.6.11/build -> /usr/src/linux-2.6.11

. Я не знаю, что ещё думать.

Но у меня то и в дебиан и в генту собирается без проблем, что и было продемонстрировано.

А куда делся Makefile в этой же директории с сорсами твоего модуля, в котором должно быть "obj-m:=mymodule.o"? Ты случайно не завалил /usr/src/linux-2.6.11/Makefile, который нельзя трогать? kernel-headers установлены?
нет. я его просто переименовал в Makefile1. всё нах непрально делал..я думал. что его надо на свой . пнятно. терь просто ошибки полезли. якобы должна существовать папочка asm в хедерах.
это уже другаяя кривота. будем разбираться.
Цитата
Marco пишет:
пнятно. терь просто ошибки полезли. якобы должна существовать папочка asm в хедерах.
это уже другаяя кривота. будем разбираться.

Это из-за того, что ты не собирал из этих сорсов ядро, т.е. нет конфигурации ядра и дерево исходников не подготовлено к сборке модулей.

Демонстрирую сборку под ядро 2.6.11 с нуля:

$ tar xvfj linux-2.6.11.tar.bz2
linux-2.6.11/
linux-2.6.11/drivers/
linux-2.6.11/drivers/video/
linux-2.6.11/drivers/video/aty/
linux-2.6.11/drivers/video/aty/radeon_monitor.c
linux-2.6.11/drivers/video/aty/mach64_accel.c
linux-2.6.11/drivers/video/aty/mach64_gx.c

Подготавливаю дерево исходников ядра для сборки внешнего модуля(если ядро уже собиралось, либо используются kernel-headers, make -C /usr/src/kernel-headers-xxx, то эта стадия пропускается)

Создаю конфиг ядра с поддержкой модулей ядра:

*** End of Linux kernel configuration.
*** Execute 'make' to build the kernel or try 'make help'.

Непосредственно подготовка дерева исходников для сборки(создание autoconf.h, version.h, необходимые симлинки вроде linux/asm -> linux/asm-i386):

/linux-2.6.11 $ make modules_prepare
CHK include/linux/version.h
UPD include/linux/version.h
SYMLINK include/asm -> include/asm-i386
SPLIT include/linux/autoconf.h -> include/config/*
CC scripts/mod/empty.o
HOSTCC scripts/mod/mk_elfconfig
MKELF scripts/mod/elfconfig.h
HOSTCC scripts/mod/file2alias.o
HOSTCC scripts/mod/modpost.o
HOSTCC scripts/mod/sumversion.o
HOSTLD scripts/mod/modpost
HOSTCC scripts/kallsyms
HOSTCC scripts/conmakehash
CC arch/i386/kernel/asm-offsets.s
CHK include/asm-i386/asm_offsets.h
UPD include/asm-i386/asm_offsets.h

А теперь сборка модуля:

/module $ cat Makefile
obj-m := mymodule.o

static int hello_init(void)
printk(KERN_ALERT "Hello World\n");
return 0;
>

static void hello_exit(void)
printk(KERN_ALERT "Goodbuy World\n");
>

/linux-2.6.11/ M=$PWD modules
make: Entering directory `/home/user/linux-2.6.11'
CC [M] /home/user/module/mymodule.o
Building modules, stage 2.
MODPOST
CC /home/user/module/mymodule.mod.o
LD [M] /home/user/module/mymodule.ko
make: Leaving directory `/home/user/linux-2.6.11'
user@box

/module $ ls mymodule.ko
mymodule.ko
user@box

/module $ modinfo ./mymodule.ko
filename: ./mymodule.ko
license: Dual BSD/GPL
vermagic: 2.6.11 686 gcc-3.4
depends:
user@box

Это способ сборки не зависящий от дистрибутива и он 100% рабочий. В Debian проще установить kernel-headers и собирать по "cd

/module;make -C /usr/src/kernel-headers-xxx $PWD modules" как я показывал ранее.

afb0f0864a2447d18a2028af1aa0a80f.jpg

Нужно установить пакет openswan из исходников.
README: make programs install
Из директории папки запускаю и получаю ошибку.

Как установить?

Думается мне, что у вас проблема с пробелом в пути. Переместите куда-нибудь в home и попробуйте еще раз.

fsockopen

а вот такой вопрос. какой антоним у make install?очень интересно

Спасибо. Не хотел устанавливаться с рабочего стола. С home все пошло. С чем интересно связано?

borisdenis

question 1: Написали же что пробел в пути, вот с этим и связано. Ну и возможно с русскими символами в пути.

С пробелом точно не связано пробовал не один раз. Русские символы.

impeee

Скачал дистрибутив openswan-2.6.40.tar.gz, в распакованной директории от рута пишу "make install" - все ставится

make[2]: *** [install] Ошибка 1
make[2]: выход из каталога «/home/heavy/temp/openswan-2.6.40/OBJ.linux.x86_64/programs»
Makefile:10: ошибка выполнения рецепта для цели «install»
make[1]: *** [install] Ошибка 1
make[1]: выход из каталога «/home/heavy/temp/openswan-2.6.40/OBJ.linux.x86_64»
Makefile:184: ошибка выполнения рецепта для цели «install»
make: *** [install] Ошибка 2
такое было?

impeee

Дмитрий: OBJDIR: OBJ.linux.x86_64
(cd /home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64 && OBJDIRTOP=/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64 OBJDIR=/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64 make install )
make[1]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64»
make[2]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib»
make[3]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libopenswan»
true
make[3]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libopenswan»
make[3]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libpluto»
make[3]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libpluto»
make[3]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto»
make[4]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto/libaes»
make[4]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto/libaes»
make[4]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto/libdes»
make[4]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto/libdes»
make[4]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto/libmd5»
make[4]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto/libmd5»
make[4]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto/libsha1»
make[4]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto/libsha1»
make[4]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto/libsha2»
make[4]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto/libsha2»
make[4]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto/libmd2»
make[4]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto/libmd2»
make[4]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto/liboswcrypto»
make[4]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto/liboswcrypto»
make[3]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libcrypto»
make[3]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libwhack»
make[3]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libwhack»
make[3]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libipsecconf»
make[3]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libipsecconf»
make[3]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/liboswlog»
make[3]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/liboswlog»
make[3]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/liboswkeys»
make[3]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/liboswkeys»
make[2]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib»
make[2]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/programs»
make[3]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/programs/proc»
make[3]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/programs/proc»
make[3]: вход в каталог «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/programs/pluto»
make[3]: *** Нет правила для сборки цели «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/lib/libopenswan/libopenswan.a», требуемой для «pluto». Останов.
make[3]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/programs/pluto»
/home/heavy/Загрузки/openswan-2.6.49/programs/Makefile:59: ошибка выполнения рецепта для цели «install»
make[2]: *** [install] Ошибка 1
make[2]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64/programs»
Makefile:10: ошибка выполнения рецепта для цели «install»
make[1]: *** [install] Ошибка 1
make[1]: выход из каталога «/home/heavy/Загрузки/openswan-2.6.49/OBJ.linux.x86_64»
Makefile:185: ошибка выполнения рецепта для цели «install»
make: *** [install] Ошибка 2

impeee

question 1: Проблема возникает со сборкой 'plulo'? cd ./programs/pluto && make install

impeee

question 1: Да, вижу. Надо гуглить, как его собрать ) Понятия не имею, что это за либа.

Читайте также: