如何使用`make`创建最终的可执行文件?

时间:2013-06-06 14:40:38

标签: linux makefile dynamic-linking gtk2

我正在尝试为使用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

3 个答案:

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