2011-09-16 35 views
5

Tôi muốn xây dựng ứng dụng của mình dưới Linux nhưng tôi không thể lấy makefile của mình để làm cho nó.
sự cố là các thư viện tĩnh tôi muốn liên kết. Tôi nhận được rất nhiều "tài liệu tham khảo không xác định để" thông báo lỗi như:Tham chiếu không xác định trong Linux makefile

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

hoặc

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

Đây là makefile của tôi:

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 $< 

Vấn đề là tôi không có ý tưởng về makefiles. Tôi chỉ sao chép một cái hiện có và cố điều chỉnh nó. Dường như không làm việc, và tôi không thể tìm thấy một makefile ví dụ bao gồm các thư viện tĩnh.

+4

Makefile là tất cả tốt và tốt. Lỗi duy nhất bạn đang thực hiện là bạn sử dụng trình biên dịch C để biên dịch và liên kết C++. Trình biên dịch C++ được gọi là 'g ++' (chúng thực sự giống nhau trừ một vài mặc định, đó là lý do tại sao nó * gần như * hoạt động). –

+2

Không liên quan đến vấn đề của bạn, nhưng bạn không cần quy tắc '% .o:% .cpp', vì thực hiện một quy tắc. Nó gần như giống nhau, nhưng nó cũng bao gồm' $ (CPPFLAGS) '(cờ tiền xử lý C)). Vì vậy, trừ khi bạn đang cố tình loại trừ những người đó, bạn sẽ nhận được một makefile "thành ngữ" hơn nếu bạn chỉ sử dụng quy tắc ngầm định. https://www.gnu.org/software/make/manual/make.html là một bài đọc vui nhộn. Vài giờ nó cần để slog thông qua các bit quan trọng sẽ được hoàn trả thông qua ít thời gian nhìn chằm chằm vào makefiles trong sự hoài nghi bên trong, oh, khoảng 4 giờ :-) –

Trả lời

15

CXX = gcc

Bạn đang liên kết với gcc, chứ không phải là g++, vì vậy -lstdc++ không liên kết theo mặc định. Lưu ý rằng việc sử dụng gcc để biên dịch các nguồn C++ hoạt động tốt, vì g++ được gọi ngầm định trong trường hợp đó.

3

Nếu bạn không có đầu mối về cách viết Makefiles, có lẽ bạn nên xem xét một số trình tạo Makefile, ví dụ: autotools, cmake vv Đây là dễ dàng hơn nhiều để sử dụng trong quan điểm của tôi, và, một khi bạn nắm vững sử dụng của họ, mạnh hơn nhiều.

Các vấn đề liên quan