Установка переменных среды и включение ссылок на каталоги в Makefile - PullRequest
0 голосов
/ 01 декабря 2011

У меня есть C-файл, который включает в себя заголовок, который сам включает в себя "jni.h".В настоящее время я компилирую файл с помощью команды:

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

для запуска результирующего файла .o, переменных среды для CLASSPATH и JAVAHOME.

Теперь я хочу использовать этот файлв существующем C-проекте, где они используют make-файлы.Проект Postgresql.В этом проекте используются Makefiles.Я хочу добавить необходимые инструкции в make-файл в папке, куда я добавляю файл, чтобы я мог запустить его вместе с проектом.

Текущий make-файл имеет следующее:

subdir = src/backend/storage/smgr
top_builddir = ../../../..
include $(top_builddir)/src/Makefile.global

OBJS = md.o smgr.o smgrtype.o

include $(top_srcdir)/src/backend/common.mk

Что мне добавить в make-файл, чтобы скомпилировать мой c-файл с проектом?

Спасибо


*Edit 1 *

Я, вероятно, должен был заявить, что я пытался сделать.До сих пор я добавил несколько исходных файлов в модуль postgres SMGR (исходный каталог).Все они работали нормально, просто добавив fileName.o в список файлов OBJS.Например, если бы я добавил Ac, я бы добавил Ao в список OBJS, и файл будет скомпилирован и добавлен в проект.

Теперь новый файл, который я пытаюсь добавить, это hdfs_test.c, этоотличается от других исходных файлов, которые я добавил ранее.Разница в том, что он не компилируется с помощью простой команды gcc, но нуждается в команде, которую я показал выше.Я попытался вручную сгенерировать файл .o, добавив его в свой Makefile:

OBJS = md.o smgr.o smgrtype.o hdfs_FD.o hdfsManager.o smgrWrapper.o hdfs_test.o

include $(top_srcdir)/src/backend/common.mk

hdfs_test.o : hdfs_test.c
        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

Когда Make, я получаю следующую ошибку:

/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 0 has invalid symbol index 12

/ usr / bin/ ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение 1 имеет недопустимый индекс символа 13 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение 2 имеет недопустимый индекс символа 2 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение 3 имеет недопустимый индекс символа 2 / usr / bin /ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение 4 имеет недопустимый индекс символа 12 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o (.debug_info): перемещение 5 имеет недопустимый индекс символа 14 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение 6 имеет недопустимый индекс символа 14 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение 7 имеет недопустимый индекс символа 14 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o (.debug_info): перемещение 8 имеет недопустимый индекс символа 2 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info):перемещение 9 имеет недопустимый индекс символа 2 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение 10 имеет недопустимый индекс символа 13 / usr / bin / ld: / usr /lib / debug / usr / lib / crt1.o (.debug_info): перемещение 11 имеет недопустимый индекс символа 14 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение12 имеет недопустимый индекс символа 14 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение 13 имеет недопустимый индекс символа 14 / usr / bin / ld: / usr / lib/debug/usr/lib/crt1.o(.debug_info): перемещение 14 имеет недопустимый индекс символа 14 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение 15имеет недопустимый индекс символа 14 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение 16 имеет недопустимый индекс символа 14 / usr / bin / ld: / usr / lib /debug / usr / lib / crt1.o (.debug_info): перемещение 17 имеет недопустимый индекс символа 14 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение 18 имеетнедопустимый индекс символа 14 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение19 имеет недопустимый индекс символа 14 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение 20 имеет недопустимый индекс символа 14 / usr / bin / ld: / usr / lib/debug/usr/lib/crt1.o(.debug_info): перемещение 21 имеет недопустимый индекс символа 14 / usr / bin / ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): перемещение 22имеет недопустимый индекс символа 22 /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o: в функции _start': (.text+0x18): undefined reference to main 'collect2: ldвозвращено 1 состояние выхода make: * [tati.o] Ошибка 1

Надеюсь, это прояснит ситуацию.

Ответы [ 3 ]

1 голос
/ 01 декабря 2011

postgress использует среду сборки automake, судя по всему.

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

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

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

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

Тем не менее, я бы начал с добавления нового файла .o в OBJS и посмотрел, что произойдет. Вероятно, это будет предполагать, что есть исходный файл с тем же базовым именем и Just Work Файл не дает никакой информации о зависимостях, поэтому он, вероятно, автоматически сгенерирует ее без какого-либо ввода от вас.

С другой стороны, вся система может быть мусором ....

0 голосов
/ 02 декабря 2011

Это действительно зависит от того, что именно ваш код пытается сделать, и почему JVM и C ++ играют роль.Это может вообще не сработать, даже если вы его построите.Возможно, вам следует обсудить детали с разработчиками PostgreSQL.Вам также может быть лучше создать свой код в виде разделяемой библиотеки и установить его как расширение.

...