2011-12-04 38 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 

因此,簡單地增加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 

,但它沒有工作,我一直得到製作試圖編譯hdfs_test.c不包括指令的錯誤消息。

我該如何執行Make來包含hdfs_test.c的編譯指令?

感謝

回答

2

你並不需要通過-l-L在編譯時,只有在鏈接時。編譯時只需要-I(包含路徑)指令來幫助編譯器找到任何額外的頭文件。

您應該將源文件編譯爲.o文件,與所有其他文件相同。然後,在鏈接器被調用來創建postgres可執行文件時,將-L-l指令添加到鏈接命令行。這意味着您需要在src/backend/storage/smgr/Makefile中編輯的所有行都是OBJS行,用於添加您的輸出對象,如以下所述。刪除你的自定義規則,這是不必要的,也是不正確的。

只需將您的額外庫添加到$(LIBS)變量並通過src/Makefile.global將您的-L路徑添加到$(LDFLAGS)src/Makefile.globalconfiguresrc/Makefile.global.in生成,因此您實際上需要修改configure的行爲以添加包含庫路徑和庫。請勿直接編輯0​​;編輯configure.in並用autoconf重新生成。

是的,GNU Autotools有時也被稱爲autohell。這有點......有趣......有時候會合作,並且在做簡單的事情時可能會涉及很多間接方法。

+0

嗨克雷格..你能請詳細說明一些細節嗎? 首先,如何將額外的包含文件夾添加到$(LIBS)? 我可以在內部生成文件(文件夾smgr中的文件)中執行如下操作:LIBS =/IncludeFolder1:/ IncludeFolder2? 我也檢查了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之外,不要直接混淆Makefiles。修改$(LIBS),讓'configure'將它們添加到它生成的'Makefile'中。要了解更多關於autoconf的信息,我建議你看看其中的一個教程和文檔。基本上,你需要學習autoconf如何工作;這不是我可以在StackOverflow評論中教的東西。看教程。 –

+0

另外:你不能從內部makefile加入'LIBS',因爲recursive make不會傳播變量變化備份調用樹。你必須從調用'postgres'的鏈接器的'Makefile'或更好的'makefile'中執行它,或者通過修改configure來添加到'Makefile'中的'$(LIBS)'' Makefile.in'。 –

相關問題