2011-04-09 81 views
1

我需要编译一个旧的应用程序,其tarball只包含* .c和* h,即。没有Makefile。根目录包含应用程序,而子目录包含应用程序所需的库。Makefile来编译c/h?

我的Make/Makefile知识不是很好,我想知道编译这个应用程序+库最简单的方法是什么。

谢谢。


编辑:使用这个脚本...

# cat compile.bash 
#!/bin/bash 

cd mylib 
for cfile in *.c; do 
    ofile=$(echo "$cfile" | sed 's#.c$#.so#') 
    gcc -shared -c "$cfile" -o "$ofile" 
done 

cd .. 
gcc *.c -I mylib -L mylib -mylib -o myapp 

...我注意到,在每个MYLIB * .c文件编译成* .so文件,而不是每个编译成/目标文件和构建一个单一的.so文件,我会得到大量的警告和错误,例如。

unzip.c: In function âunzipâ: 
unzip.c:991: warning: format not a string literal and no format arguments 

gcc: unrecognized option '-mylib' 

file_util.c: In function âfile_moveâ: 
file_util.c:98: error: âerrnoâ undeclared (first use in this function) 

我不知道如何编译库,然后编译应用程序没有错误/警告。

+0

哎哟 - sed的对每个源文件的调用??如果你真的需要设置这个变量,可以尝试'ofile = $ {cfile%.c} .so'这个应该做同样的事情,而不是每次为每个源文件启动另一个进程。 – 2011-04-10 21:02:43

回答

1

无需使用for循环或生成中间对象文件:

(cd mylib && gcc -shared -fPIC -o libfoo.so *.c) && \ 
    gcc -Imylib -o app *.c mylib/libfoo.so 
+0

感谢您的命令。我得到了很多警告/错误,所以我假设我要么丢失一些指向头文件/库或某些其他开关的指针(例如,ansi,std99等)www.pastebin.com/brPvXhdz – Gulbahar 2011-04-11 09:20:50

+0

问题解决:我是使用旧版本的工具链比我应该使用。此外,只使用CFLAGS = -Wall -02删除警告。 – Gulbahar 2011-04-11 12:36:37

1

编译库:

cd libfoo 
for cfile in *.c; do 
    ofile=$(echo "$cfile" | sed 's#.c$#.so#') 
    gcc -shared -c "$cfile" -o "$ofile" 
done 

在这之后,你应该有一个libfoo.so文件libfoo的/。然后,编译程序(不要忘了cd回):

gcc *.c -I libfoo -L libfoo -lfoo -o application 
0

最简单的可能是得到一个IDE为你做的构建。 Netbeans for one将创建一个Makefile,以便您可以独立于IDE构建项目。