【问题标题】:Running a program from a makefile从 makefile 运行程序
【发布时间】:2017-10-02 17:14:06
【问题描述】:

我从教授那里收到了这个示例 makefile,我正在尝试在 Ubuntu 上运行它,但我输入的命令不会运行它。 makefile 中的所有文件都已经存在,当我键入 make 时,它​​会生成文件,但实际程序不会运行。我尝试输入 ./a.out ,但它也没有运行。请帮我输入什么命令才能运行程序。

# Makefile for Library Management System
CXXFLAGS += --std=c++11

all: div main
rebuild: div clean main

debug: CXXFLAGS += -g
debug: rebuild

main: main.o controller.o view.o library.o publication.o
    $(CXX) $(CXXFLAGS) -o lms main.o controller.o view.o library.o publication.o 
main.o: main.cpp *.h
    $(CXX) $(CXXFLAGS) -c main.cpp
controller.o: controller.cpp *.h
    $(CXX) $(CXXFLAGS) -c controller.cpp
test_view: test_view.o controller.o view.o library.o publication.o
    $(CXX) $(CXXFLAGS) -o test_view test_view.o controller.o view.o library.o publication.o 
test_view.o: test_view.cpp view.h publication.h library.h
    $(CXX) $(CXXFLAGS) -c test_view.cpp
test_library: test_library.o library.o publication.o
    $(CXX) $(CXXFLAGS) -o test_library test_library.cpp library.o publication.o
test_library.o: test_library.cpp *.h
    $(CXX) $(CXXFLAGS) -c test_library.cpp
library.o: library.cpp *.h
    $(CXX) $(CXXFLAGS) -c library.cpp
test_publication: test_publication.o publication.o 
    $(CXX) $(CXXFLAGS) -o test_publication test_publication.o publication.o 
test_publication.o: test_publication.cpp *.h
    $(CXX) $(CXXFLAGS) -c test_publication.cpp
publication.o: publication.cpp *.h
    $(CXX) $(CXXFLAGS) -c publication.cpp

clean:
    -rm -f *.o lms test_age test_genre test_media test_publication test_library test_view test_view_actual.txt

div:
    @echo
    @echo 'X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-'
    @echo '-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X'
    @echo 'X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-'
    @echo '-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X'
    @echo

【问题讨论】:

  • 只是一个疯狂的猜测:规则名称后面的命令应该用制表符缩进,但在你的 sn-p 我看到 4 个空格。
  • TAB 字符在Makefile-s 中很重要

标签: c++ ubuntu makefile


【解决方案1】:

是否有一个名为“lms”的文件?尝试运行:./lms

makefile 中'-o' 之后的内容指定输出文件名。这些是您可以运行的程序。

【讨论】:

  • lms 是 'main' 目标指定的输出文件。 (-o lms)
  • 呃。这是一个糟糕的 makefile,我没有注意到,因此我之前的评论。程序名称应该与非缩进行冒号前的名称相同,但在这种情况下不是。
  • 啊。您可以使用特殊变量“$@”将其更改为目标名称。
  • @Breezyb12 甜蜜!有机会请采纳我的回答。
  • @vincent 是的,或者最好不要包含main: main.o controller.o view.o library.o publication.o 之外的任何内容(或使用名称lms 的一些变体),因为Make can take it from there
【解决方案2】:

make 的工作是构建程序,而不是运行它,所以 makefile 可能工作得很好。

从一行可以看出:

all: div main

makefile 默认会尝试构建divmain

div 有一条规则,它只是将内容打印到控制台:

div:
    @echo
    @echo 'X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-'
    @echo '-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X'
    @echo 'X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-'
    @echo '-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X'
    @echo

如另一个答案的 cmets 中所述,main 的规则具有 gcc -o lms 的标志,因此实际输出的可执行文件名称将是 lms

你真的应该告诉你的教授这是不好的形式,因为 makefile 应该构建一个与它的规则同名的文件。 (即make main 应该建立一个名为main 的文件)如果他不同意,请随时指出他。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 2013-03-12
    相关资源
    最近更新 更多