繁体   English   中英

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

[英]How do I create the final executable file using `make`?

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

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

您可能要添加后缀规则:

.SUFFIXES: .c .o
.c.o:
        gcc -c `pkg-config --cflags gtk+-2.0` $<

我不确定是什么问题,但是可以通过手动指定编译命令来解决。

# 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

在构建.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格式的.c从.c构建.o的隐含规则:

    $(CC) $(CPPFLAGS) $(CFLAGS) -c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM