2009-04-24 34 views
15

Làm cách nào để đặt biến LD_LIBRARY_PATH env từ một tệp Makefile?đặt LD_LIBRARY_PATH từ Makefile

Tôi có một số mã nguồn liên kết tới một thư viện được chia sẻ mà lần lượt liên kết đến một thư viện được chia sẻ khác (hơn 1). Makefile để xây dựng ứng dụng chỉ biết về thư viện được chia sẻ đầu tiên.

Nếu tôi muốn xây dựng điều này, tôi phải chỉ định: #export LD_LIBRARY_PATH=/path/to/the/shared/libs (đối với bash) và hoạt động tốt.

Tuy nhiên, tôi muốn thực hiện điều này từ chính Makefile.

Trả lời

2

Tôi đã cố gắng nói thêm:

export LD_LIBRARY_PATH=/path/to/the/shared/libs 

mà dường như hoạt động tốt.

Tôi đã gặp lỗi vì/path/to/the/shared/libs của tôi không chính xác.

vẫn sẽ được tốt để biết những gì người khác làm cho điều này và/nếu có một cách tốt hơn.

+1

Bạn có chắc chắn rằng nó hoạt động không? Sự hiểu biết của tôi là nếu bạn làm điều đó từ makefile, 'LD_LIBRARY_PATH' sẽ được định nghĩa cho quá trình này và các tiến trình con, nhưng không phải trong trình bao mà bạn chạy' make'. – Gauthier

9

Có, "xuất" là chỉ thị chính xác để sử dụng. Tài liệu được mô tả chi tiết here. Đây là cơ chế tương tự như tự sử dụng để truyền các biến tới các phần phụ. Hạn chế là bạn không thể chuyển đổi một cách có chọn lọc biến thành một số lệnh và không phải cho các lệnh khác.

Có hai lựa chọn khác mà tôi có thể nghĩ đến:

  • Sử dụng .EXPORT_ALL_VARIABLES (ghi rõ như một mục tiêu ở đâu đó), gây ra tất cả các biến được xuất khẩu sang các môi trường của tiểu lệnh.
  • định trên dòng lệnh:

    foo: 
        EXPORTEDVAR=somevalue gcc $< -o [email protected] 
    
7

Nếu bạn không muốn xuất biến LD_LIBRARY_PATH trong makefile (ví dụ bởi vì bạn có Makefiles đệ quy mà tất cả thêm vào biến), bạn có thể giữ cho nó bị ràng buộc với tất cả các cuộc gọi đến trình biên dịch và trình liên kết của bạn.

Hoặc bạn thêm nó trực tiếp đến tất cả gcc và ld cuộc gọi trong phạm vi quy định mục tiêu của bạn, ví dụ

my_target: my_target.o 
    LD_LIBRARY_PATH=/my/library/path gcc -o my_target my_target.o 

hoặc bạn thiết lập các biến làm toàn cầu để xác định các trình biên dịch bao gồm đường dẫn, ví dụ .:

CC=LD_LIBRARY_PATH=/my/library/path gcc 
CPP=LD_LIBRARY_PATH=/my/library/path gcc 
CXX=LD_LIBRARY_PATH=/my/library/path gcc 

tôi đã chọn gcc khi biên dịch nhưng tất nhiên bạn có thể sử dụng bất kỳ trình biên dịch bạn muốn.

2

tôi đã cùng một vấn đề, tôi đã xuất khẩu LD_LIBRARY_PATH như bạn đã làm:

export LD_LIBRARY_PATH=/path/to/the/shared/libs ; my_command 

Bạn tôi cho tôi một sự thay thế khi LD_LIBRARY_PATH chỉ áp dụng cho một lệnh, chú ý không dấu chấm phẩy dưới đây.

LD_LIBRARY_PATH=/path/to/the/shared/libs my_command 

Điều này article giải thích thêm.

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