【问题标题】:Cygwin g++ build error: undefined reference toCygwin g++ 构建错误:未定义的引用
【发布时间】:2012-12-05 08:00:44
【问题描述】:

我正在尝试使用 NetBeans cygwin g++ 编译器构建一个项目 (rar file)。 我可以通过在 ubuntu 下的 src/ 目录中运行 make 来构建它。但是在cygwin下,一直给我undefined reference to...

(在编译之前,我在src/Makefile中将CC = g++改成了CC = g++-3。)

错误说undefined reference to BufMgr::pinPage(int, Page*&, int, char const*),其中pinPage()位于include/

这是项目的结构。

project/
    include/
        buf.h (where pinPage() was defined)
        other header files
    src/
        Makefile
        other source files

以下是原始 Makefile 和错误。

生成文件:

#
# Makefile for CS564 Minibase project.  Needs GNU make.
#
# Define DEBUGREL for some kind of debugging output (not from us, from
# the original Minibase implementors.)
#
# Warning: make depend overwrites this file.

.PHONY: depend clean backup setup

MAIN = btree

MINIBASE = ..

CC = g++

#CFLAGS = -DUNIX -Wall -g
CFLAGS = -g

INCLUDES = -I${MINIBASE}/include -I.

LFLAGS = -L. -lbtree -lm

SRCS = main.C btree_driver.C btfile.C btindex_page.C btleaf_page.C btree_file_scan.C key.C db.C new_error.C sorted_page.C system_defs.C

OBJS = $(SRCS:.C=.o)

$(MAIN):  $(OBJS)
    $(CC) $(CFLAGS) $(INCLUDES) $(OBJS) -o $(MAIN) $(LFLAGS)

.C.o:
    $(CC) $(CFLAGS) $(INCLUDES) -c $<

depend: $(SRCS)
    makedepend $(INCLUDES) $^

clean:
    rm -f *.o *~ $(MAIN)
    rm -f my_output

backup:
    -mkdir bak
    cp Makefile *.[Ch] bak

run:
    rm -rf my_output
    ./btree > my_output

# Grab the sources for a user who has only the makefile
setup:
    /bin/cp -i $(MINIBASE)/src/*.[Ch] .
    /bin/cp -i $(MINIBASE)/src/*.sample .

# DO NOT DELETE THIS LINE -- make depend needs it 

错误:

$ make
g++-3 -g -I../include -I. -c main.C
g++-3 -g -I../include -I. -c btree_driver.C
g++-3 -g -I../include -I. -c btfile.C
g++-3 -g -I../include -I. -c btindex_page.C
g++-3 -g -I../include -I. -c btleaf_page.C
g++-3 -g -I../include -I. -c btree_file_scan.C
g++-3 -g -I../include -I. -c key.C
g++-3 -g -I../include -I. -c db.C
g++-3 -g -I../include -I. -c new_error.C
g++-3 -g -I../include -I. -c sorted_page.C
g++-3 -g -I../include -I. -c system_defs.C
g++-3 -g -I../include -I. main.o btree_driver.o btfile.o btindex_page.o btleaf_page.o btree_file_scan.o key.o db.o new_error.o sorted_page.o system_defs.o -o btree -L. -lbtree -lm
btfile.o: In function `_ZN9BTreeFileC2ER6StatusPKc':
/cygdrive/c/Users/Trantor/Documents/NetBeansProjects/DB-HW6/src/btfile.C:78: undefined reference to `BufMgr::pinPage(int, Page*&, int, char const*)'
btfile.o: In function `_ZN9BTreeFileC1ER6StatusPKc':
/cygdrive/c/Users/Trantor/Documents/NetBeansProjects/DB-HW6/src/btfile.C:78: undefined reference to `BufMgr::pinPage(int, Page*&, int, char const*)'
btfile.o: In function `_ZN9BTreeFileC2ER6StatusPKc8AttrTypeii':

.....

【问题讨论】:

  • 不可能说出问题所在,因为您没有显示完整的错误。但是,可以推断这是一个链接器错误,这意味着您需要链接的目标文件或库,但没有。
  • 我已将错误和项目目录结构附加到问题中。
  • 是头文件中完全定义缺少的函数,还是头文件附带了源文件?
  • 没有。 include/buf.h 将 BufMgr::pinPage() 定义为 Status pinPage(int PageId_in_a_DB, Page*&amp; page, int emptyPage=0, const char *filename=NULL);。并且在 src/include/ 中都没有完全定义函数。
  • 那么这个功能其实没有实现?

标签: netbeans g++ cygwin undefined-reference


【解决方案1】:

这可能是因为文件扩展名似乎是.C。在区分大小写的文件系统 (Unix) 上,大写 .C 扩展名表示 C++ 代码,而小写 .c 表示普通的旧 C 代码。因此编译器可能会尝试将其编译为 C 代码,这会产生不同的函数名称。

如果是这个原因,那么可能的修复:

  • 通过向 CFLAGS 添加正确的编译开关强制 gcc 编译 C++(-x c++,快速谷歌搜索)
  • 将文件重命名为.cpp,并修复 Makefile 中的扩展名

【讨论】:

  • 我试过-x c++。但它给了我main.o:1:1: error: stray ‘\1’ in program main.o:1:1: error: stray ‘\20’ in program main.o:1:4: warning: null character(s) ignored main.o:1:1: error: stray ‘\210’ in program main.o:1:11: warning: null character(s) ignored main.o:1:14: warning: null character(s) ignored ....
  • @trantor 不要给 CFLAGS 链接命令。或者,将 -x 直接添加到编译命令行。
  • 谢谢。但事实证明是起源错误(它已经将它们视为.cpp)。
猜你喜欢
  • 1970-01-01
  • 2016-12-09
  • 2017-09-12
  • 2018-04-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多