2010-05-01 30 views
14

Tôi đang cố gắng di chuyển ứng dụng của mình từ xây dựng thủ công sang autoconf, hiện đang hoạt động rất độc đáo. Nhưng tôi có một thư viện tĩnh mà tôi không thể tìm ra cách tích hợp. Thư viện đó sẽ KHÔNG được đặt trong các vị trí thư viện thông thường - vị trí của tệp nhị phân (.a) và tiêu đề (tệp .h) sẽ được đưa ra dưới dạng đối số cấu hình. (Đáng chú ý, ngay cả khi tôi chuyển tệp .a sang/usr/lib hoặc bất kỳ nơi nào khác mà tôi có thể nghĩ, nó vẫn không hoạt động.) Nó cũng không được đặt tên theo truyền thống (nó không bắt đầu bằng "lib" hoặc "l ").Autoconf - bao gồm một thư viện tĩnh (newbie)

tay biên soạn đang làm việc với những (thư mục là không thể dự đoán được - đây chỉ là một ví dụ):

gcc ... -I/home/john/mystuff /home/john/mystuff/helper.a 

(Uh, tôi thực sự không hiểu tại sao file .a được tham chiếu trực tiếp, không phải với -L hoặc bất cứ điều gì. Có, tôi có một nửa hiểu biết về xây dựng các chương trình C.)

Vì vậy, trong configuration.ac của tôi, tôi có thể sử dụng đối số cấu hình có liên quan để tìm thành công tiêu đề (.h tệp) sử dụng AC_CHECK_HEADER. Bên trong AC_CHECK_HEADER tôi sau đó thêm vị trí vào CPFLAGS và #include của tệp tiêu đề trong mã C thực tế chọn nó một cách độc đáo.

Cho một tham số cấu hình đã được đưa vào vị trí $ và tên của các file cần thiết là helper.h và helper.a (mà là cả hai trong cùng thư mục), đây là những gì làm việc cho đến nay:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"]) 

Trường hợp tôi gặp khó khăn là nhận tệp nhị phân (.a) được liên kết. Không có vấn đề gì tôi cố gắng, tôi luôn gặp lỗi về tham chiếu không xác định đối với hàm gọi cho thư viện đó. Tôi khá chắc chắn đó là một vấn đề liên kết, bởi vì tôi có thể phiền phức với mã C và thực hiện một lỗi có chủ ý trong các hàm gọi tới thư viện tạo ra các lỗi trước đó cho biết rằng các nguyên mẫu hàm đã được nạp và sử dụng để biên dịch.

Tôi đã thử thêm vị trí chứa tệp .a vào LDFLAGS và sau đó thực hiện AC_CHECK_LIB nhưng không tìm thấy.

Có thể cú pháp của tôi sai, hoặc có thể tôi thiếu một thứ gì đó cơ bản hơn, điều này sẽ không đáng ngạc nhiên vì tôi là người mới và không thực sự biết mình đang làm gì.

Dưới đây là những gì tôi đã cố gắng:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS -L$location"; 
    AC_CHECK_LIB(helper)]) 

Không xúc xắc. AC_CHECK_LIB đang tìm kiếm -lhelper tôi đoán (hoặc libhelper?) Vì vậy tôi không chắc chắn nếu đó là một vấn đề, vì vậy tôi đã cố gắng này, quá (bỏ AC_CHECK_LIB và bao gồm .a trực tiếp trong LDFLAGS), mà không có may mắn:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS -L$location/helper.a"]) 

Để thi đua biên soạn sử dụng, tôi đã cố gắng loại bỏ các -L nhưng điều đó không giúp:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS $location/helper.a"]) 

tôi đã cố gắng kết hợp và hoán vị khác, nhưng tôi nghĩ rằng tôi có thể thiếu một cái gì đó cơ bản hơn ....

================ CẬP NHẬT

tôi đã nhận nó để làm việc với một con đường mã hóa cứng vào file .a trong Makefile.am sử dụng _LDADD như thế này:

myprog_LDADD=/home/john/mystuff/helper.a 

Nhưng tôi không thể dự đoán vị trí của file .a. Đối với một số lý do, xác định myprog_LDADD trong cấu hình.ac không hoạt động (tôi muốn nó đã làm, vì vậy tôi có thể sử dụng biến vị trí động của tôi), và không có sự kết hợp của những thay đổi để LDFLAGS, myprog_LDFLAGS, AM_LDFLAGS dường như làm việc.

Nếu trong Makefile.am, tôi cố gắng sử dụng các vị trí biến mà được định nghĩa trong configure.ac, nó không hoạt động

myprog_LDADD=($location)helper.a 

============ ==== UPDATE

Tôi nghĩ rằng tôi đã tìm ra, nhưng vì tôi không biết mình đang làm gì, tôi thực sự đánh giá cao một số phản hồi. Tôi đã từng AC_SUBST() để có được myprog_LDADD làm việc từ configure.ac, vì vậy giải pháp cuối cùng trông như thế này:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location" 
    myprog_LDADD="$location/helper.a" 
    AC_SUBST(myprog_LDADD)]) 
+0

Rất nhiều câu trả lời cùng một lúc. Bạn có thể nhận được nhiều câu trả lời hơn nếu bạn hỏi một câu hỏi tại một thời điểm và sẽ dễ dàng hơn nếu bạn định dạng đoạn trích mã đúng cách-- nối tiếp mỗi dòng với bốn dấu cách. – ptomato

Trả lời

8

Bạn có thể thiết lập vị trí trong configure.ac:

LOCATION=/home/john/mystuff 
AC_SUBST(LOCATION) 

AC_SUBST định nghĩa biến $LOCATION trong tất cả các số Makefile.am của bạn và cũng thay thế tất cả các lần xuất hiện của @[email protected] với nội dung của $LOCATION. Vì vậy, sau đó trong số Makefile.am bạn có thể làm

myprog_CPPFLAGS="-I$LOCATION" 
myprog_LDADD="$LOCATION/helper.a" 

PS. Lý do tại sao bạn cần phải tham khảo thư viện trực tiếp là vì -l tìm thư viện được đặt tên đúng (ví dụ: libhelper.a) trong thư mục thư viện hệ thống. Tuy nhiên, vì không có nhiều sự khác biệt giữa một thư viện tĩnh và một tệp đối tượng, nên không cần phải tham khảo một cách kỳ diệu nó bằng cách sử dụng -l; bạn chỉ có thể biên dịch nó vào chương trình của bạn như bạn đang làm bây giờ.

+0

OK, cảm ơn. Nhìn thấy những gì bạn đã đề xuất, có vẻ như tôi đã làm khá nhiều điều tương tự, bằng cách sử dụng AC_SUBST() để truyền bá myprog_LDADD tới Makefiles. Có gì sai với phương pháp của tôi so với phương pháp của bạn không? THANK YOU FOR THE HELP !!!!!! – EBM

+0

Ngoài ra, có một số lý do đưa helper.a vào LDFLAGS không hoạt động nhưng thêm nó vào myprog_LDADD không? Tôi rõ ràng không hiểu sự khác biệt giữa hai người. Một lần nữa, CẢM ƠN BẠN. – EBM

+0

Phương thức của bạn định nghĩa myprog_LDADD trong tất cả các tệp makefiles, không chỉ là tệp bạn cần. Điều này có thể gây ra sự cố. – ptomato

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