我想在linux下构建我的应用程序,但是我无法让我的makefile生成它。
问题是我想链接的静态库。我得到了很多的“未定义的引用”错误信息,如: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*)'
这里是我的makefile:
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 [email protected] $(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文件。我只是复制一个现有的并试图调整它。似乎没有工作,我找不到包含静态库的示例生成文件。
生成文件都很好。你所犯的唯一错误是你使用C编译器来编译和链接C++。 C++编译器被称为'g ++'(除了少数默认值外,它们实际上是相同的,这就是它几乎可以工作的原因)。 –
与你的问题无关,但你不应该需要'%.o:%.cpp'规则,因为make有一个内建的。它几乎相同,但它也包括'$(CPPFLAGS)'(C预处理器标志)。所以除非你故意排除这些,否则如果你只是使用隐式规则,你会得到一个更“惯用”的makefile。 https://www.gnu.org/software/make/manual/make.html是一个很好的阅读。几个小时花费在重要的部分上的时间将会通过更少的时间在难以置信的内部盯着makefile而得到偿还,哦大约4个小时:-) –