2009-05-19 46 views
5

Tôi vừa mới viết một Makefile để xây dựng một thư viện chia sẻ, tương tự như sau:Makefile cho Thư viện được chia sẻ?

libmystuff.so: CFLAGS+=-fPIC -shared 
libmystuff.so: libmystuff.o otherstuff.o 
    $(CC) $(CFLAGS) -o [email protected] $^ 

Tôi thích để tránh làm những hành động rõ ràng khi điều này có vẻ như một hoạt động phổ biến, nhưng có vẻ như không có quy tắc ngầm hay khác được xây dựng để tiêu chuẩn hóa này. Tôi đang sử dụng GNU Thực hiện trên Linux tại thời điểm này, nhưng sẽ cần điều này để làm việc trên OS X là tốt.

EDIT: Tôi hỏi về thực hiện các quy tắc thay vì biên dịch/cờ liên kết.

Bạn có thể đề xuất các quy tắc Makefile sạch sẽ, có thể tái sử dụng để xây dựng các thư viện được chia sẻ không? Có thể là quy tắc loại %.so: hoặc .c.so:?

Trả lời

9

Đối với tính di động, tôi muốn nhìn vào tích hợp libtool.

define compile_rule 
     libtool --mode=compile \ 
     $(CC) $(CFLAGS) $(CPPFLAGS) -c $< 
endef 
define link_rule 
     libtool --mode=link \ 
     $(CC) $(LDFLAGS) -o [email protected] $^ $(LDLIBS) 
endef 

LIBS = libmystuff.la 
libmystuff_OBJS = libmystuff.lo otherstuff.lo 

%.lo: %.c 
     $(call compile_rule) 

libmystuff.la: $(libmystuff_OBJS) 
     $(call link_rule) 

install/%.la: %.la 
     libtool --mode=install \ 
     install -c $(notdir [email protected]) $(libdir)/$(notdir [email protected]) 
install: $(addprefix install/,$(LIBS)) 
     libtool --mode=finish $(libdir) 

libtool sẽ tự động thêm -fPIC/-DPIC/-shared cờ khi thích hợp, và tạo ra bất cứ điều gì .o/.a/.so file sẽ được sử dụng trên nền tảng hiện tại.

Hoặc bạn có thể sử dụng tích hợp libtool của Automake.

+0

libtool có vẻ là cách tốt nhất. Đó là một sự xấu hổ hướng dẫn sử dụng ném bạn đến những con sói (xem http://www.gnu.org/software/libtool/manual/libtool.html#Makefile-rules) trừ khi bạn đang sử dụng toàn bộ bộ Autotools. – dwc

5

Xây dựng thư viện được chia sẻ phụ thuộc vào nền tảng. Ví dụ, các cờ bạn đang sử dụng là ok cho GCC cho các nền tảng ELF, ví dụ, bạn không thêm -fPIC cho một số nền tảng và trình biên dịch khác mà bạn cần các cờ khác.

Bạn cần một trong số:

  • Cung cấp một tùy chọn để thiết lập cờ cho nền tảng người dùng.
  • Sử dụng tiêu chuẩn xây dựng hệ thống như Autotools
+0

Tôi ổn với mỗi cờ nền tảng. Tôi thực sự hỏi về quy tắc. Xem câu hỏi đã chỉnh sửa, cảm ơn. – dwc

+0

dwc, công việc viết cờ trên nền tảng đã được thực hiện. Nó được gọi là Autotools. Tôi hứa với bạn nó sẽ dễ dàng hơn hàng ngàn lần so với những gì bạn muốn làm (trông giống như xây dựng Autotools của riêng bạn từ đầu). –

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