【问题标题】:Undefined reference in Linux makefileLinux makefile 中未定义的引用
【发布时间】:2011-11-18 11:21:18
【问题描述】:

我想在 linux 下构建我的应用程序,但我无法获取我的 makefile。
问题是我想链接的静态库。我收到很多“未定义的引用”错误消息,例如:

undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'

undefined reference to `cgicc::Cgicc::Cgicc(cgicc::CgiInput*)'

这是我的生成文件:

CXX = gcc

INCL_CGICC = ../cgicc-3.2.9
INCL_OPENSSL = ../openssl-1.0.0e/include
INCL_LOG4CPLUS = ../log4cplus-1.0.4/include
INCL_BOOST = ../boost_1_46_1
INCLUDES = -I$(INCL_CGICC) -I$(INCL_OPENSSL) -I$(INCL_LOG4CPLUS) -I$(INCL_BOOST)

CXXFLAGS = -Wall -D_LINUX -DVERSNUM=2 -DVERSMAJOR=0 -DVERSMINOR=0 $(INCLUDES)

TARGET = myapp
OBJS = Main.o 

all: $(TARGET)
strip -s $<
mv -f $< release 

$(TARGET): $(OBJS)
$(CXX) -static -o $@ $(OBJS) \
            ../cgicc-3.2.9/cgicc/.libs/libcgicc.a \
            ../openssl-1.0.0e/libssl.a \
            ../openssl-1.0.0e/libcrypto.a \
            ../log4cplus-1.0.4/src/.libs/liblog4cplus.a \
            -ldl -lpthread

%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $<

问题是我不知道makefile。我只是复制了一个现有的并尝试对其进行调整。似乎没有用,而且我找不到包含静态库的示例 makefile。

【问题讨论】:

  • makefile 一切正常。您所犯的唯一错误是您使用 C 编译器来编译和链接 C++。 C++ 编译器被称为g++(它们实际上是相同的,除了一些默认值,这就是它几乎工作的原因)。
  • 与您的问题无关,但您不需要 %.o: %.cpp 规则,因为 make 内置了一个。几乎相同,但它还包括 $(CPPFLAGS)(C 预处理器标志)。因此,除非您故意排除这些,否则如果您只使用隐式规则,您将获得更“惯用的”makefile。 gnu.org/software/make/manual/make.html 是一本好书。花费几个小时来完成重要的部分将通过更少的时间得到回报,在大约 4 小时内难以置信地盯着 makefile :-)

标签: c++ linux makefile


【解决方案1】:

CXX = gcc

您链接的是gcc,而不是g++,因此默认情况下不会链接-lstdc++。 请注意,使用 gcc 编译 C++ 源代码可以正常工作,因为在这种情况下会隐式调用 g++

【讨论】:

    【解决方案2】:

    如果你不知道如何编写 Makefile,也许你应该看看一些 Makefile 生成器,例如autotools、cmake 等。在我看来,这些都更容易使用,而且一旦你掌握了它们的使用,它们就会变得更强大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多