2011-08-18 17 views
14

Làm thế nào để xây dựng và cài đặt một mô-đun .so với autotools/libtool mà không có thư viện .la và .a cũng được cài đặt vào đường dẫn --prefix?Xây dựng .so mô-đun với autotools/libtool mà không có .la và .a biến thể đang được cài đặt

Hiện nay tôi đang sử dụng sau Makefile.am:

lib_LTLIBRARIES = libCurlDownloader.la 
libCurlDownloader_la_SOURCES = Curl.cpp 
libCurlDownloader_la_LDFLAGS = -module -avoid-version 

Nó hoạt động, nhưng ngoài libCurlDownloader.so nó cũng cài đặt libCurlDownloader.la và libCurlDownloader.a, những gì là không mong muốn.

Update # 1

Có thể làm .a không được tạo ra, bằng cách sử dụng một trong hai

./configure --disable-static 

hoặc

AC_ENABLE_SHARED(yes) 
AC_ENABLE_STATIC(no) 

trong configure.ac

Nhưng nó vẫn là câu hỏi làm thế nào để làm cho .la không b eing cài đặt vào cài đặt --prefix trong khi có .so cài đặt.

Update # 2

Nó có thể loại bỏ .la tập tin từ cài đặt --prefix sử dụng

install-exec-hook: find $(DESTDIR)$(libdir) -type f -name \*.la -delete 
+0

Bạn có lỗi đánh máy nhỏ (nên cài đặt-exec-hook). – Compholio

+0

Tôi nghĩ rằng bạn không thể, debian packagers được loại bỏ bằng tay la tập tin trong các gói deb – sherpya

+0

Đó 'install-exec-hook' có vẻ như là một ý tưởng tồi. Nó sẽ xóa tất cả các tệp .la khỏi thư mục, không chỉ các tệp được tạo bởi dự án của bạn. Không có vấn đề gì nếu 'DESTDIR' được sử dụng, nhưng rất sai. – Maarten

Trả lời

1

Bạn không nên nhất thiết phải xóa các file .la. Các tệp .la chứa thông tin được sử dụng trong hai trường hợp:

  1. Kết nối tĩnh với thư viện được xây dựng. Khi liên kết tĩnh (tức là, .a với -static), không có thông tin về phụ thuộc của thư viện được liên kết, vì vậy libtool có thể sử dụng thông tin trong tệp .la để tạo một lệnh ld thích hợp tham chiếu tất cả các phụ thuộc cần thiết. Điều này thường quan trọng hơn trên một môi trường như MinGW, nơi mà trình liên kết yêu cầu cùng một thư viện được chỉ định bội số theo một thứ tự cụ thể để giải quyết các phụ thuộc đệ quy. Đây chỉ là mối quan tâm nếu người ta dự định xây dựng một nhị phân tĩnh.

  2. động tải các thư viện xây dựng trên một số nền tảng (ví dụ, với lt_dlopen nếu sử dụng libltdl). Tương tự, trên các nền tảng nhất định, phụ thuộc của mô-đun biên dịch không được mã hóa trong tệp nhị phân, do đó, cần có tệp .la để lt_dlopen tìm và tải các phụ thuộc chính xác. Trên các nền tảng ELF (bao gồm cả Linux) và nền tảng PE (tức là Windows), các phụ thuộc được lưu trữ trong thư viện, do đó, lt_dlopen sẽ hoạt động mà không có các tệp .la. Định dạng MachO trên MacOS có thể yêu cầu .la tệp khi tạo gói.

Các đóng gói Debian/Ubuntu đã quyết định để loại trừ .la tập tin từ gói của họ, vì lý do thứ hai là không thích hợp trên Linux và họ sẽ thích bạn không xây dựng mã nhị phân tĩnh ở nơi đầu tiên. Trên các nền tảng khác, libtool được thiết kế để hỗ trợ, các tệp .la có thể cần thiết để liên kết hoặc chạy chương trình.

+2

Đối với phụ thuộc liên kết tĩnh; có hầu như luôn luôn (thậm chí thường xuyên hơn sau đó các tập tin .la hiện có) 'pkg-config' hướng dẫn có sẵn. –

+3

Similary - ngay cả đối với liên kết động 'pkg-config' cung cấp trợ giúp tốt hơn sau đó nạng nẹp; theo cách độc lập của hệ thống. –

2

Tôi tình cờ gặp câu hỏi này bởi vì nó sử dụng thuật ngữ "mô-đun", trong automake/libtool nói là thuật ngữ cho một plugin. Tôi có một hệ thống plugin trong Finit, vì vậy tôi xây dựng các plugin của tôi với '-module' để tránh tạo các tệp .a. Nhưng tôi vẫn nhận được các tập tin .la, mà thực sự thậm chí không áp dụng trong trường hợp '-module'.

tôi chưa tìm ra cách ghi lại để bỏ qua .la file cho plugin, nhưng đây là cách tôi làm điều đó:

AM_LDFLAGS = -module -avoid-version -shared 
pkglib_LTLIBRARIES = alsa-utils.la bootmisc.la 

install-exec-hook: 
     @(cd $(DESTDIR)$(pkglibdir) && $(RM) $(pkglib_LTLIBRARIES)) 

Để được rõ ràng, trong trường hợp sử dụng của tôi không có ai đi "liên kết" với plugin của tôi .so's, vì vậy các tệp .la thực sự không sử dụng.

+0

Bạn đã tìm thấy nó chưa? Tôi thực sự ghét điều này. –

+0

@iharob nope, vẫn sử dụng quy tắc móc đó để dọn sạch các tệp .la. Dự án là [ở đây] (https://github.com/troglobit/finit) nếu bạn muốn xem thêm chi tiết. – troglobit

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