设置环境变量并包括Makefile中的链接目录

时间:2011-12-01 04:26:02

标签: c gcc makefile autoconf automake

我有一个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。在这个项目中使用了Makefile。我想在我添加文件的文件夹中为makefile添加所需的指令,以便我可以在项目中运行它。

当前的makefile具有以下内容:

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

为了用项目编译我的c文件,我应该在makefile中添加什么?

由于


* 修改1 *

我可能应该说明我想要做的事情。到目前为止,我已经将多个源文件添加到postgres SMGR模块(源目录)。 只需将fileName.o添加到OBJS文件列表中,它们都可以正常工作。例如,如果我添加了A.c,我会将A.o添加到OBJS列表中,文件将被编译并添加到项目中。

现在我要添加的新文件是hdfs_test.c 这与我之前添加的其他源文件不同。不同之处在于它不能使用简单的gcc命令进行编译,但需要我上面显示的命令。 我尝试通过将其添加到我的Makefile手动生成.o文件:

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 个答案:

答案 0 :(得分:1)

postgress从它的外观使用automake构建环境。

您对Just的了解似乎有限,所以我建议您阅读以下内容:

并在那里做示例,然后为hdfs_test修改它们。一旦你理解了如何做到这一点,你就能够回答你的问题。当你在那里偶然发现问题时,我很乐意帮助你解决问题。

答案 1 :(得分:0)

这实际上取决于您的代码究竟要做什么,以及为什么JVM和C ++扮演的角色。它可能根本不起作用,即使你要构建它。您应该与PostgreSQL开发人员讨论细节。您可能最好将代码构建为共享库并将其作为扩展安装。

答案 2 :(得分:0)

由多个目录中的多个文件组成的Makefile通常很难理解,并且依赖大量的黑魔法才能正常工作,所以向我们展示一个小文件可能没什么意义。

那就是说,我首先将一个新的.o文件添加到OBJS,看看会发生什么。可能它会假设有一个相同基本名称的源文件,而Just Work。该文件没有提供任何依赖性信息,因此它可能会在没有您输入的情况下自动生成该信息。

另一方面,整个系统可能都是垃圾......