Использование Makefile для добавления новых файлов исходного кода в Postgresql - PullRequest
1 голос
/ 04 декабря 2011

Я работаю над добавлением некоторых функций в модуль менеджера хранилища в Postgresql.Я уже добавил несколько исходных файлов в папку smgr, и мне удалось включить их в систему Make, добавив их имена в список OBJS в файле Makefile внутри папки smgr.(т.е. когда я добавляю Ac, я бы добавил Ao в список OBJS).

Это работало нормально.Сейчас я пытаюсь добавить новый файл hdfs_test.c в проект.Проблема с этим файлом заключается в том, что он требует некоторых дополнительных директив в своей команде компиляции (-I и -L директивы).

Команда gcc:

gcc hdfs_test.c -I/HDFS_HOME/hdfs/src/c++/libhdfs -I/usr/lib/jvm/default-java/include -L/HDFS_HOME/hdfs/src/c++/libhdfs -L/HDFS_HOME/build/c++/Linux-i386-32/lib -L/usr/lib/jvm/default-java/jre/lib/i386/server -ljvm -lhdfs -o hdfs_test

Следовательно, просто добавив hdfs_test.o к списку OBJS не работает.Я попытался отредактировать Makefile, чтобы он выглядел так:

OBJS = md.o smgr.o smgrtype.o A.o B.o hdfs_test.o

MyRule1 : hdfs_test.c
gcc tati.c -c -I/diskless/taljab1/Workspace/HDFS_Append/hdfs/src/c++/libhdfs -I/usr/lib/jvm/default-java/include -L/diskless/taljab1/Workspace/HDFS_Append/hdfs/src/c++/libhdfs -L/diskless/taljab1/Workspace/HDFS_Append/build/c++/Linux-i386-32/lib -L/usr/lib/jvm/default-java/jre/lib/i386/server -ljvm -lhdfs

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

Как сделать так, чтобы Make включал мои директивы компиляции для hdfs_test.c?

Спасибо

1 Ответ

2 голосов
/ 04 декабря 2011

Вам не нужно передавать -l и -L во время компиляции, только во время ссылки.Во время компиляции требуются только директивы -I (include path), чтобы помочь компилятору найти дополнительные заголовки.

Вы должны скомпилировать ваш исходный файл в файл .o, как и все остальные.Затем добавьте директивы -L и -l в командную строку ссылки, когда компоновщик вызывается для создания исполняемого файла postgres.Это означает, что все, что вам нужно отредактировать в src/backend/storage/smgr/Makefile, - это строка OBJS, чтобы добавить ваш выходной объект, как вы уже сделали ниже.Удалите ваше пользовательское правило, оно не нужно, а также неверно.

Просто добавьте ваши дополнительные библиотеки в переменную $(LIBS) make и добавьте ваши пути -L в $(LDFLAGS) через src/Makefile.global.src/Makefile.global генерируется configure из src/Makefile.global.in, поэтому вам действительно нужно изменить поведение configure, чтобы добавить ваши включения, пути к библиотекам и библиотеки.Также не редактируйте configure напрямую;отредактируйте configure.in и заново сгенерируйте его с помощью autoconf.

Да, GNU Autotools иногда называют autohell по определенной причине.С этим немного ... интересно ... иногда работать, и при выполнении простых вещей может быть много косвенности.

...