2009-02-05 38 views
20

Tôi đang xây dựng gói được quản lý autoconf đầu tiên của mình.Độ phân giải thư viện với autoconf?

Tuy nhiên, tôi không thể tìm thấy bất kỳ ví dụ đơn giản nào về cách chỉ định thư viện được yêu cầu và tìm thư viện đó ở nơi khác nhau.

tôi hiện có:

AC_CHECK_LIB(['event'], ['event_init']) 

nhưng:

  1. Nó không tìm thấy phiên bản được cài đặt trong /opt/local/lib
  2. Nó không phàn nàn nếu thư viện không phải là thực sự được tìm thấy
  3. Tôi cần đặt đường dẫn bao gồm thành /opt/local/include quá

bất kỳ sự giúp đỡ, hoặc liên kết đến bài hướng dẫn khá nhiều đánh giá cao ...

+0

Có phải điều này [Tài liệu về AC \ _CHECK \ _LIB] (http://www.shlomifish.org/lecture/Autotools/slides/common_macros/AC_CHECK_LIB.html) có giúp ích gì không? – leed25d

Trả lời

10

Bạn không cần phải tự thiết lập CFLAGS, CXXFLAGSLDFLAGS nếu bạn muốn gcc/g ++ để tìm trong các địa điểm không chuẩn.

Vì vậy, trước khi gọi AC_CHECK_LIB(), làm điều gì đó như

CFLAGS="$CFLAGS -I/opt/local/include" 
CXXFLAGS="$CXXFLAGS -I/opt/local/include" 
LDFLAGS="$LDFLAGS -L/opt/local/lib" 

Bạn không cần CXXFLAGS nếu bạn chỉ sử dụng gcc suốt kịch bản cấu hình của bạn.

+0

Tôi cho rằng dòng đầu tiên phải là CPPFLAGS chứ không phải CFLAGS? – Alnitak

+0

Tôi đã có nghĩa là CFLAGS trong dòng đầu tiên, tuy nhiên như xa như tiêu đề đi, CPPFLAGS cũng nên làm các trick. – codelogic

+2

Tôi đồng ý với Alnitak theo nghĩa là nên sử dụng CFLAGS/CXXFLAGS (tùy thuộc vào trình biên dịch C/C++ bạn định sử dụng) chỉ nên được sử dụng cho các đối số trình biên dịch (như "-g", "-O3"). Bao gồm nên đi đến CPPFLAGS (C Pre Processor). –

8

Nếu thư viện gửi tệp .pc, hãy xem xét sử dụng macro PKG_CHECK_MODULES() thực hiện những điều bạn muốn. Nếu đó là thư viện của riêng bạn, chỉ cần gửi một tệp .pc vào/usr/lib/pkgconfig, nó sẽ giúp các nhà phát triển khác sử dụng nó dễ dàng hơn nhiều.

+0

lib của tôi gửi tệp .pc. Nơi đặt macro PKG_CHECK_MODULES()? Cảm ơn. –

12

tập lệnh autoconf không thể đoán vị trí thư viện "tùy chọn", có thể thay đổi từ nền tảng này sang nền tảng khác. Vì vậy, bạn có thể nói

CPPFLAGS="-I/opt/local/include" LDFLAGS="-L/opt/local/lib" ./configure 

Đối AC_CHECK_LIB() bạn cần phải xác định không điều kiện một cách rõ ràng trong "action-if-false" lập luận:

dnl This is simply print "no" and continue: 
AC_CHECK_LIB([m], [sqrt123]) 
dnl This will stop: 
AC_CHECK_LIB([m], [sqrt123], [], [AC_MSG_ERROR([sqrt123 was not found in libm])]) 

Output:

checking for sqrt123 in -lm... no 
checking for sqrt123 in -lm... no 
configure: error: sqrt123 was not found in libm 

AC_CHECK_LIB() không không theo mặc định vì lý do hiển nhiên: người ta có thể kiểm tra một số thư viện khác nhau cung cấp chức năng tương tự và chọn một trong số họ :)

Ngoài ra, hãy xem this post cho chủ đề tương tự.

+4

Tốt hơn, './configure CPPFLAGS = ...' sẽ nhớ biến trong './config.status --recheck' tiếp theo, chẳng hạn. Xem http://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Defining-Variables.html –

+0

Gợi ý hay, tôi đồng ý. –

2

Tôi biết đây là một chủ đề cũ, nhưng tôi đoán điều này có thể giúp một số người ra ngoài. Đây là cách tôi tìm thấy một số thứ.

hdff="no" 
hdffprefix="ERROR" 
AC_ARG_WITH(hdf,[ --with-hdf    Compile with hdf library, for output.],[hdffprefix=$withval hdff="yes"],[]) 
# if there is no value given, it appears tha hdffprefix is set to "yes" 
if test $hdffprefix = "yes" -a $hdff = "yes" 
then 
    echo "HDF: Attempting to find HDF" 
    hdffprefix="ERROR" 

    # check if hdffprefix is set, if it is not, it sets it to "ERROR" and the 
    # 'if' comparison evaluates to true 
    if [[ "$hdffprefix" == "ERROR" ]] 
    then 
     echo "HDF: hdffprefix not set, searching PATH" 
     for i in `echo $PATH | tr ':' '\n'` 
     do 
      if [[ $i == *hdf* ]] 
      then 
       if [[ $i == *bin/* ]] 
       then 
        hdffprefix=${i%bin/} 
        # if it doesn't exist, re-set to ERROR 
        if [[ ! -f ${hdffprefix}include/hdf.h ]] 
        then 
        hdffprefix="ERROR" 
        fi 
       elif [[ $i == *bin* ]] 
       then 
        hdffprefix=${i%bin} 
        # if it doesn't exist, re-set to ERROR 
        if [[ ! -f ${hdffprefix}include/hdf.h ]] 
        then 
        hdffprefix="ERROR" 
        fi 
       fi 
      fi 
     done 
     if [[ "$hdffprefix" == "ERROR" ]] 
     then 
      echo "HDF: hdffprefix not found in PATH, trying 'which'" 
      WHICH_TEST_HDF=`which hdf2gif` 
      if [[ WHICH_TEST_HDF != "" ]] 
      then 
       hdffprefix=${WHICH_TEST_HDF%bin/hdf2gif} 
      else 
       echo "HDF: Warning - hdf not found" 
      fi 
     fi 
    fi 
    if [[ "$hdffprefix" != "ERROR" ]] 
    then 
     hdff="yes" 
     echo "HDF found: $hdffprefix" 
    fi 
fi 
if test $hdff = 'yes'; then 
     hdfincs=" -DUSE_HDF -I"${hdffprefix}"include" 
     scriptotherlibsinc=${scriptotherlibsinc}" -L"${hdffprefix}"/lib" 
     scriptotherlibs=${scriptotherlibs}" -lmfhdf -ldf -ljpeg -lz" 
    AC_CHECK_HEADERS([${hdffprefix}/include/hdf.h],,[AC_MSG_ERROR([Cannot find hdf.h])]) 
    AC_CHECK_HEADERS([${hdffprefix}/include/mfhdf.h],,[AC_MSG_ERROR([Cannot find mfhdf.h])]) 
fi 
0

Vì vậy, bạn muốn thiết lập autoconf để tìm các thư mục này tự động và codelogic đưa ra câu trả lời; nhưng giả sử bạn không muốn tìm kiếm ở đó trên tất cả hệ thống, chỉ trên một mac.Bạn có thể thêm như sau

AC_CANONICAL_HOST 
case $host_os in 
    darwin*) 
     CFLAGS="$CFLAGS -I/opt/local/include" 
     CXXFLAGS="$CXXFLAGS -I/opt/local/include" 
     LDFLAGS="$LDFLAGS -L/opt/local/lib" 
     ;; 

esac 

Lưu ý rằng tôi đã thêm nó như là một cây trường hợp để bạn có thể thêm những thứ cho một loạt các hệ điều hành sau đó (chẳng hạn như Linux * và BSD).

0

Đối với trường hợp đó, cách tiêu chuẩn là có biến môi trường CPLUS_INCLUDE_PATH với đường dẫn không chính thức bao gồm tệp và LIBRARY_PATH cho thư viện. Nhắc nhở rằng bạn không phải thay đổi bất cứ điều gì trong configure.ac. Vì vậy bạn chỉ có thể gọi cho cấu hình theo cách này:

$ export CPLUS_INCLUDE_PATH=/opt/local/include 
$ export LIBRARY_PATH=/opt/local/lib 
$ ./configure 

Khả năng di chuyển Lưu ý: Trong khi điều này sẽ làm việc trên nhiều trình biên dịch hiện đại, không phải tất cả các trình biên dịch sẽ tôn trọng các biến này. Một số trình biên dịch chéo sẽ hoàn toàn bỏ qua hoặc ghi đè lên chúng, điều này buộc một người phải sử dụng các điều chỉnh CFLAGSLDFLAGS như được đề cập trong các câu trả lời khác.

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