0

我正在尝试为一个使用 GTK 库的小项目编写一个生成文件。

# 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
4

3 回答 3

2

看起来您的编译阶段无法找到包含文件。当我看到您如何构建.o文件时,没有-I标志指示在哪里可以找到gtk包含文件。

您可能需要添加后缀规则:

.SUFFIXES: .c .o
.c.o:
        gcc -c `pkg-config --cflags gtk+-2.0` $<
于 2013-06-06T14:50:14.920 回答
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
于 2013-06-06T16:45:14.337 回答
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
于 2013-06-07T11:33:17.690 回答