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)])
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