2017-05-04 31 views
10

Tôi đang biên dịch một số mã nguồn yêu cầu một số dylib từ dự án khác mà tôi đã xây dựng. Tôi nhận đượcCách biên dịch nguồn sử dụng đường dẫn dylib trên macOS Sierra từ vỏ

ld: biểu tượng (s) không tìm thấy cho kiến ​​trúc x86_64`

Bất cứ khi nào tôi thực hiện

g++ some_code.cpp -I/usr/local/include -o executable_binary 

Tôi biết rằng g++ không có khả năng tìm ra biên soạn dylibs (cài đặt tại /usr/local/include) kể từ khi lỗi cũng đề cập đến rất nhiều biểu tượng cụ thể là một phần của dylibs.

Tôi đã cố gắng này:

  1. Thi install_name_tool -id "@/usr/local/lib/requiredlib.dylib" /usr/local/lib/requiredlib.dylib
  2. Thêm -L/usr/local/lib với các tùy chọn biên dịch.
  3. Thêm tất cả đường dẫn dylib một cách rõ ràng vào tùy chọn biên dịch.
  4. Cố gắng thêm DYLD_LIBRARY_PATH không thành công vì Sierra không cho phép đặt biến đó vì lý do bảo mật.

Tôi biết rằng có thể thêm DYLD_LIBRARY_PATH nhưng yêu cầu tắt SIP. Tôi có thể làm điều đó bởi tôi không muốn nếu có một cách sạch hơn để làm điều này.

P .: Tôi đang cố gắng biên dịch các ví dụ hướng dẫn cho Tulip graph library.

Ký hiệu còn thiếu có liên quan đến thư viện biểu đồ mà tôi đã cài đặt. Thông báo lỗi là:

Undefined symbols for architecture x86_64: 
    "tlp::saveGraph(tlp::Graph*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, tlp::PluginProgress*)", referenced from: 
     _main in tutorial001-02ee7e.o 
    "operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, tlp::Graph const*)", referenced from: 
     _main in tutorial001-02ee7e.o 
ld: symbol(s) not found for architecture x86_64 

Bất cứ khi nào tôi làm ls /usr/local/lib/requiredlib.dylib tất cả thư viện được biên dịch từ Tulip đều có.

g++ -v sản xuất:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 8.1.0 (clang-802.0.42) 
Target: x86_64-apple-darwin16.5.0 
Thread model: posix 
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 

Sau khi thực hiện ls /usr/local/include/tulip/ tôi nhận được danh sách các file *.h của các thư viện tôi có ý định sử dụng.

+0

Nó không thực sự rõ ràng những biểu tượng bạn đang thiếu, những gì biến thể của g ++ bạn đang chạy, vv Và chắc chắn thư viện biên dịch của bạn không được cài đặt trong '/ usr/local/include' – pvg

+1

Chỉnh sửa câu hỏi của bạn để thêm các chi tiết . – pvg

+0

Để được trợ giúp về liên kết không thành công, bạn cần phải đăng ít nhất một dòng lệnh liên kết không hợp lệ và đầu ra của nó, * nguyên văn *. Các báo cáo sơ sài của những gì bạn đã làm quá mơ hồ để khiến chúng tôi không thể đoán trước được. –

Trả lời

2

Bạn có thể đặt -rpath cho các thư viện tìm kiếm. Sau khi liên kết nhị phân của bạn, bạn phải sửa đổi đường dẫn tìm kiếm của lib, e. g .:

g++ some_code.cpp -I/usr/local/include -o binary \ 
    -L/usr/local/lib -lrequiredlib -Wl,-rpath,/usr/local/lib 
install_name_tool -change /usr/local/lib/librequiredlib.dylib \ 
    '@rpath/librequiredlib.dylib' binary 

Lệnh install_name_tool thay đổi tên của thư viện trong nhị phân sao cho lib sẽ được tìm kiếm trong đường dẫn. Nếu bạn không chắc chắn về tên chính xác, hãy sử dụng otool -L binary để xem tất cả các thư viện được liên kết với tệp thực thi của bạn.

Xem trang người đàn ông của ldinstall_name_tool để biết thêm thông tin về rpath. install_name_tool cũng có thể thêm nhiều đường đi kèm với -add_rpath.

4

Bên cạnh đó, bạn cũng có thể nhìn vào undefined tùy chọn ld

Chỉ định cách ký tự không xác định đang được điều trị. Các tùy chọn là: lỗi, cảnh báo, triệt tiêu hoặc dynamic_lookup. Mặc định là lỗi.

Bạn sẽ gọi số -Wl,-undefined,dynamic_lookup khi biên dịch nhị phân.

Bạn cũng có thể tận dụng -lazy-lx hoặc -lazy-library path để thư viện không được tải cho đến khi hàm đầu tiên được gọi, có thể giúp trong một số trường hợp.

Sau đó, thêm cờ rpath quá, sau khi đã đổi tên với install_name_tool như @macmoonshine đã hiển thị, nhưng hãy đảm bảo trỏ đến đúng đường dẫn. Theo mặc định, Tulip được cài đặt trong thư mục thư viện mặc định /usr/local nhưng được đề xuất trong hướng dẫn cài đặt để thực hiện trong thư mục được quản lý bởi người dùng.

Giống như lệnh sau, cho tất cả thư viện được yêu cầu bởi tulip.

install_name_tool -change ./build-release/lib/libtulip-core-4.11.dylib '@rpath/libtulip-core-4.11.dylib' tutorial001 

Và cũng có thể sử dụng -Wl,-rpath,./build-release/lib trong khi biên soạn hướng dẫn.

0

Có vẻ như bạn đang bẻ khóa các ví dụ x86_64, bạn có kiểm tra xem .dylibs đã cài đặt của bạn cũng là x86_64 không?

Sử dụng otool hoặc file lệnh để xác định rằng dylib của bạn là x86_64. Ví dụ, hãy thử một cái gì đó như thế này file /usr/local/lib/requiredlib.dylib. Nếu bạn không thấy điều này trong đầu ra:

requiredlib.dylib (đối với kiến ​​trúc x86_64): Mach-O 64-bit tự động liên kết chia sẻ thư viện x86_64

sau đó vấn đề của bạn là vòm không hạnh phúc khi xây dựng libs và khi xây dựng mã nên sử dụng các libs này.

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