我正在尝试为使用GTK库的小项目编写一个makefile。
# Compiler
cc = gcc
#Options for Development
CFLAGS = `pkg-config --cflags --libs gtk+-2.0`
all: pss
pss : main.o interface.o
# $(cc) $(CFLAGS) -o pss main.o interface.o
main.o : main.c interface.h
interface.o : interface.c
pss
应该是最终的可执行文件。但是,makefile不会创建可执行文件pss
。当我明确添加用于创建pss
的行时,我收到链接错误。
asheesh:~/Source$ make
gcc `pkg-config --cflags --libs gtk+-2.0` -o pss main.o interface.o
interface.o: In function `interface':
interface.c:(.text+0x1e): undefined reference to `gtk_init'
interface.c:(.text+0x28): undefined reference to `gtk_window_new'
interface.c:(.text+0x38): undefined reference to `gtk_widget_show'
interface.c:(.text+0x3d): undefined reference to `gtk_main'
collect2: ld returned 1 exit status
make: *** [pss] Error 1
如何使用make
创建最终的可执行文件?
更改了makefile以正确处理库依赖项。仍然没有工作。
#Options for Development
CFLAGS = `pkg-config --cflags gtk+-2.0`
#Libraries
LIBS = `pkg-config --libs gtk+-2.0`
all: pss
pss : main.o interface.o
$(cc) $(LIBS) $(CFLAGS) -o pss main.o interface.o
main.o : main.c interface.h
$(cc) $(CFLAGS) -o main.o main.c interface.o
interface.o : interface.c
$(cc) $(CFLAGS) $(LIBS) -o interface.o interface.c
答案 0 :(得分:2)
看起来您的编译阶段无法找到包含文件。当我看到您构建.o
文件的方式时,没有-I
标记来指示在哪里找到gtk
包含文件。
您可能需要添加后缀规则:
.SUFFIXES: .c .o
.c.o:
gcc -c `pkg-config --cflags gtk+-2.0` $<
答案 1 :(得分:1)
我不完全确定问题是什么,但是通过手动指定编译命令解决了这个问题。
# Compiler
cc = gcc
#Options for Development
CFLAGS = `pkg-config --cflags gtk+-2.0`
#Libraries
LIBS = `pkg-config --libs gtk+-2.0`
all: pss
pss : main.o interface.o
$(cc) -o pss main.o interface.o $(LIBS)
# $(cc) $(LIBS) -o pss main.o interface.o
# This line fails to link whereas the line above works.
main.o : main.c interface.h
$(cc) $(CFLAGS) -c main.c interface.c
interface.o : interface.c
$(cc) $(CFLAGS) -c interface.c
答案 2 :(得分:0)
在构建.o文件时(在第一条消息中),您忘记了'-c'选项。 您也不需要在编译阶段包含* .o或* .c文件:
$(cc) $(CFLAGS) -o main.o main.c interface.o // wrong
$(cc) $(CFLAGS) -c -o main.o main.c // right
以及上一段代码:
# Compiler
CC = gcc // Fixed: CAPSLOCK here
#Options for Development
CFLAGS = `pkg-config --cflags gtk+-2.0`
#Libraries
LIBS = `pkg-config --libs gtk+-2.0`
all: pss
pss : main.o interface.o
$(cc) -o pss main.o interface.o $(LIBS)
# $(cc) $(LIBS) -o pss main.o interface.o
# This line fails to link whereas the line above works.
main.o : main.c interface.h
$(CC) $(CFLAGS) -c main.c
interface.o : interface.c
$(CC) $(CFLAGS) -c interface.c
你也可以写出最后5行甚至更简单:
main.o : main.c interface.h
interface.o : interface.c
由于.c中使用以下形式的配方构建.o的隐式规则,因此不需要配方:
$(CC) $(CPPFLAGS) $(CFLAGS) -c