【问题标题】:syntax error near unexpected token `newline'意外标记“换行符”附近的语法错误
【发布时间】:2012-04-26 12:24:29
【问题描述】:

在使用Makefile 编译一些代码后,当我尝试运行它时得到了这个:

$ ./libbookgui.a
./libbookgui.a: line 1: syntax error near unexpected token `newline'
./libbookgui.a: line 1: `!<arch>'

Makefile 有以下内容。

INCLUDES = -I"$(FLTK)"
LIBS     = -lstdc++
CXXFLAGS = $(INCLUDES) -Wall -time -O3 -DNDEBUG -Wno-deprecated
LIBFLAGS = 
AR       = ar

.SUFFIXES: .cpp .o

# Create a list of source files.
SOURCES  = $(shell ls *.cpp)
# Create a list of object files from the source file lists.
OBJECTS = ${SOURCES:.cpp=.o}     
# Create a list of targets.
TARGETS = libbookgui.a

# Build all targets by default
all:    $(TARGETS)

%.a: $(OBJECTS)
    $(AR) rcs $@ $(OBJECTS)

# A rule to build .o file out of a .cpp file
%.o: %.cpp 
    $(CXX) $(CXXFLAGS) -o $@ -c $<

# A rule to clean all the intermediates and targets
clean:  
    rm -rf $(TARGETS) $(OBJECTS) *.out *.stackdump

我看到它有 TARGETS = libbookgui.a 行,编译器没有返回任何错误,它只是创建了 .a 文件。

有什么想法吗?

【问题讨论】:

  • .a 是库存档,不是可执行文件。

标签: c++ makefile


【解决方案1】:

libbookgui.a 是一个静态库(其中聚合了多个目标文件)。

您应该运行可执行文件,而不是库。将此库链接到某个可执行文件并运行 that

我建议你阅读this article

【讨论】:

  • 我看到,在链接过程中 (cc -o executable-name libctest.a) 编译器返回错误,例如:libbookgui.a(Store_main.o):Store_main.cpp:(.text+0x4b): undefined reference to Fl_Menu_::Fl_Menu_(int, int, int, int, char const*)'libbookgui.a(Store_main.o):Store_main.cpp:(.text+0x461): undefined reference to std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp; std::__ostream_insert&lt;char, std::char_traits&lt;char&gt; &gt;(std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;, char const*, int)'
  • @ignacio:这是一个不同的问题 - libctest.a 正在寻找的一些符号应该在其他库中找到,所以你也应该链接它们。此外,您还需要某个地方的main。我真的认为你应该从一些非常小而简单的事情开始,并首先让它发挥作用 - 你在这里采取的步骤对于开始来说太大了
  • 看来我忘了链接我的源文件。 (.cpp) 但是现在编译器返回 /tmp/ccLGb4Ui.o:Chrono.cpp:(.text+0x306): undefined reference to 'std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;::operator&lt;&lt;(int)' 我正在使用来自 Stroustrup's programming site. 的 Chrono 类
【解决方案2】:

您需要更新您的帖子以显示您对 makefile 所做的更改以添加链接行。否则,我们无法真正帮助您解决这部分问题。

基于这些错误,我怀疑您没有使用正确的链接工具:您要么使用“gcc”(C 编译器前端),要么尝试直接调用链接器。当您链接您的应用程序时,您应该使用 C++ 编译器(在您的情况下,$(CXX))。您也不需要指定-lstdc++,因为 C++ 前端会自动将其添加到链接行。

【讨论】:

    猜你喜欢
    • 2021-12-07
    • 2011-07-05
    • 1970-01-01
    • 2021-04-28
    • 2012-08-31
    • 2012-10-20
    • 2012-09-29
    • 2013-12-11
    相关资源
    最近更新 更多