2011-12-04 5 views
1

PostgreSQL의 스토리지 관리자 모듈에 일부 기능을 추가하려고합니다. 이미 smgr 폴더에 몇 개의 소스 파일을 추가했으며, Make 시스템에 smgr 폴더의 Makefile에있는 OBJS 목록에 이름을 추가하여 포함 시켰습니다. (예 : A.c를 추가하면 A.o를 OBJS 목록에 추가합니다).Makefile을 사용하여 Postgresql에 새로운 소스 코드 파일을 추가하십시오.

괜찮 았습니다. 이제 프로젝트에 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 

따라서, 단순히 OBJS 목록에 hdfs_test.o를 추가하면 작동하지 않습니다. I는 다음과 같이하기 위해 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 

그러나 그것은 작동하지 않았고, 나는 지시를 포함하지 않고 hdfs_test.c를 컴파일하려고 만들기의 오류 메시지를 받고 있었다.

어떻게 make를 실행하여 hdfs_test.c에 대한 컴파일 지시문을 포함합니까?

감사

답변

2

에만 링크시, 컴파일시에 -l-L을 통과 할 필요가 없습니다. 컴파일시 컴파일러가 추가 헤더를 찾을 수 있도록 -I (경로 포함) 지시문 만 필요합니다.

소스 파일을 다른 모든 파일과 마찬가지로 .o 파일로 컴파일해야합니다. 그런 다음 링커가 호출되어 postgres 실행 파일을 만들 때 -L-l 지시문을 링크 명령 줄에 추가합니다. 즉, 이미 완료 한대로 src/backend/storage/smgr/Makefile에서 편집해야하는 것은 출력 객체를 추가하는 행인 OBJS입니다. 맞춤 규칙을 삭제하면 불필요 할뿐만 아니라 잘못되었습니다.

$(LIBS) 변수에 추가 라이브러리를 추가하고 -L 경로를 $(LDFLAGS)src/Makefile.global을 통해 추가하기 만하면됩니다. src/Makefile.globalconfigure에 의해 src/Makefile.global.in에서 생성되므로 포함, 라이브러리 경로 및 라이브러리를 추가하려면 실제로 configure의 동작을 수정해야합니다. configure을 직접 편집하지 마십시오. configure.in을 편집하고 autoconf으로 다시 생성하십시오.

예, 이유는 GNU Autotools를 autohell이라고도합니다. 다소 재미 있습니다 ... 때로는 일하는 것이고, 간단한 일을하는 데는 간접적 인 일이 많이 있습니다.

+0

안녕하세요 크레이그 .. 좀 더 자세히 알려 주실 수 있습니까? 먼저 $ (LIBS)에 추가 포함 폴더를 어떻게 추가합니까? LIBS =/IncludeFolder1 :/IncludeFolder2를 내부 메이크 파일 (smgr 폴더에있는 파일)에 넣을 수 있습니까? 또한 Makefile.global.in을 확인하고 LDFLAGS에 연결 폴더를 추가 할 위치를 정확히 알지 못했습니다. 예를 들어, 나는이 발견 IFDEF PGXS LDFLAGS = -L $ (LIBDIR) 다른 LDFLAGS = -L $ (top_builddir)/SRC/포트 ENDIF LDFLAGS를 + =이 내가이 이후에 추가 할 수 @LDFLAGS : LDFLAGS + =/LinkFolder1 다음 LDFLAGS + =/LinkFolder2? 그 후 autoconf를 어떻게 사용합니까? 고마워 – Ticker23

+0

OBJS에 파일을 추가하는 것 외에는 Makefile을 직접 사용하지 마십시오. 생성하는'Makefile'에'configure'를 추가하여 $ (LIBS)를 수정하십시오. autoconf에 대해 더 많은 것을 배우기 위해 많은 튜토리얼과 문서 중 하나를 살펴 보는 것이 좋습니다. 기본적으로 autoconf를 만들고 작동시키는 법을 배워야합니다. 그건 내가 StackOverflow 주석에서 가르 칠 수있는 것이 아닙니다. 자습서를 참조하십시오. –

+0

또한 내부 makefile에서'LIBS'에 추가 할 수 없습니다. 왜냐하면 재귀 적 make는 변수 변경을 전파하여 호출 트리를 백업하기 때문입니다. 'postgres'에 대한 링커가 호출되는'Makefile'에서해야합니다 - 더 좋은 방법은 configure를 수정하여'$ (LIBS)'에'Makefile'에서 생성 한' Makefile.in'. –

관련 문제