【问题标题】:How do I create the final executable file using `make`?如何使用 `make` 创建最终的可执行文件?
【发布时间】:2013-06-06 14:40:37
【问题描述】:

我正在尝试为一个使用 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 创建最终的可执行文件?

更改了生成文件以正确处理库依赖项。还是不行。

#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

【问题讨论】:

    标签: linux makefile dynamic-linking gtk2


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果您查看帖子中的main.o,您还没有指定额外的标志来包含其中的目录。
    【解决方案2】:

    我不完全确定问题出在哪里,但通过手动指定编译命令解决了。

    # 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
    

    【讨论】:

      【解决方案3】:

      您在构建 .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
      

      【讨论】:

      • 原始文件有什么问题?我不确定您要指出什么。
      • @Arks: -c编译 .o 文件?你应该检查你写的东西;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 2018-07-15
      • 2015-04-25
      • 2011-10-22
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多