2011-12-04 100 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'。 –

相关问题