2011-08-24 33 views
7

Tôi đang xây dựng thư viện cờ dòng lệnh google-gflags cho C++ trên Mac OS X (10.7.1). Quá trình xây dựng là như vậy:Làm cách nào để sửa đổi tên cài đặt của .dylib tại thời gian xây dựng

$ ./configure --prefix=output 
$ make 
$ make install 

Tôi muốn thay đổi tên cài đặt của thư viện được tạo lúc xây dựng và không sử dụng install_name_tool sau đó.

Theo mặc định, install name của thư viện được chia sẻ tạo ra, libgflags.dylib, là con đường đầu ra:

$ otool -L ./output/libgflags.dylib 
$ ./output/libgflags.dylib: 
    /tmp/gflags-1.5/output/lib/libgflags.0.dylib (compatibility version 2.0.0, current version 2.0.0) 
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0) 

Các trang người đàn ông cho ld(1) có một lựa chọn -install_name mà có thể được sử dụng để thay đổi các cài đặt tên của một động thư viện tại thời gian liên kết.

Ví dụ, với một chương trình giả:

$ g++ -dynamiclib temp.cc -install_name /tmp/temp.dylib -o temp.dylib 
$ otool -L temp.dylib 
temp.dylib: 
    /tmp/temp.dylib (compatibility version 0.0.0, current version 0.0.0) 
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0) 

Nhưng, tôi không thể sử dụng tùy chọn này dòng lệnh với ./configure kịch bản. Tôi đã thử bằng tay thiết lập các biến CFLAGS, nhưng có kết quả trong một lỗi:

$ CFLAGS="-install_name /tmp/desired/location/libgflags.dylib" ./configure 
checking for a BSD-compatible install... /opt/local/bin/ginstall -c 
checking whether build environment is sane... yes 
checking for gawk... no 
checking for mawk... no 
checking for nawk... no 
checking for awk... awk 
checking whether make sets $(MAKE)... yes 
checking for gcc... gcc 
checking whether the C compiler works... no 
configure: error: in `/Users/vibhav/Code/install_name_test/gflags-1.5': 
configure: error: C compiler cannot create executables 

Vì vậy, là nó có thể cho tôi để thay đổi tên cài đặt của .dylib tạo ra bởi configuremake mà không sử dụng install_name_tool?

+0

Tôi không hiểu bạn đang cố gắng làm gì. Tại sao bạn không thể chạy './configure --prefix/tmp/mong muốn/location'? – adl

+0

Đó là một câu hỏi hợp lệ. Tôi không thể đặt '--prefix' thành vị trí đó vì nhiều lý do, kể cả vị trí xây dựng của tôi khác với vị trí" cài đặt "của ứng dụng của tôi. Tôi chỉ muốn chuyển cờ liên kết thích hợp trong khi sử dụng 'configure'. – v8891

+0

Kịch bản của bạn vẫn chưa rõ ràng với tôi. Bạn có thể giải thích cách chuẩn './configure --prefix/somewhere && make && make install' sai cho thiết lập của bạn không? Tại sao vị trí xây dựng của bạn lại quan trọng? (Bạn nên sử dụng một tiền tố tuyệt đối, tất nhiên.) Bạn đang cố gắng liên kết đến 'libglflags' mà không cần cài đặt nó? (Trong trường hợp đó, bạn nên sử dụng 'libtool' để liên kết ứng dụng của bạn với' libflag.la' và để libtool làm phép thuật của nó để liên kết với một thư viện không được cài đặt.) Bạn có muốn cài đặt thư viện vào một vị trí tạm thời trước khi nó được sao chép vào vị trí cuối cùng của nó? (Đó là một công việc cho biến DESTDIR.) – adl

Trả lời

5

Nói chung, việc chuyển đối số liên kết thông qua g + + phải được bắt đầu bằng -Wl và dấu cách phải được thay thế bằng dấu phẩy. Vì vậy, nếu bạn muốn vượt qua "/tmp/temp.dylib -install_name" để mối liên kết bạn sẽ cần phải gọi đây là:

g++ -Wl,-install_name,/tmp/temp.dylib ... 
4

một cách tiếp cận có thể sẽ được chỉnh sửa config.status bằng tay. nhưng trước khi tôi cố gắng làm điều đó, install_name_tool -id đã cứu mạng tôi.

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