2014-09-23 12 views
6

Trong GCC, tôi có thể sử dụng cờ liên kết -Wl,--start-group-Wl,--end-group để giải quyết các sự cố liên kết với thư viện có phụ thuộc vòng tròn. Tôi muốn làm điều tương tự với tiếng kêu vang, nhưng có vẻ như tính năng này là dropped in lld version 3.2. Tôi phải làm nó như thế nào?Liên kết các thư viện tĩnh với clang độc lập theo thứ tự

+5

https://en.wikipedia.org/wiki/Technical_debt –

+0

liệt kê tất cả các lib (theo thứ tự bất kỳ) hai lần: '-la -lb ...- lx -la -lb ... -lx' (tốt nhất được thực hiện với một tập lệnh) – mlvljr

+0

@mlvljr Điều này có thể hoặc có thể không đủ. – user1225999

Trả lời

4

Các release notes của LLVM 3.2 trạng thái đó

llvm-ld và llvm-sơ khai đã được loại bỏ, chức năng llvm-ld có thể được thay thế một phần bởi llvm-link | opt | {llc | as, llc -filetype = obj} | ld, hoặc được thay thế hoàn toàn bởi Clang.

Theo mặc định, tiếng kêu dường như sử dụng trình liên kết hệ thống. Đó là trên Linux ví dụ nó sử dụng ld GNU:

$ clang --version 
clang version 3.2 (branches/release_32 170558) 
... 
$ clang -Wl,--verbose 
GNU ld (GNU Binutils; devel:gcc/openSUSE_12.3) 2.24.0.20140403-196 
... 

Điều này cho thấy rằng bạn có thể sử dụng -Wl, - khởi động nhóm và -Wl, - cuối cùng nhóm như với GCC.

+0

Đây là trường hợp. Công cụ ld của Apple không hỗ trợ các cờ --start-group, nhưng nó cũng không quan tâm đến các phụ thuộc vòng tròn. – Mokosha

3

Tôi không phải là người hâm mộ phụ thuộc vòng tròn :) nhưng here một số người cho biết họ xử lý các trường hợp này bằng cách liên kết một số thư viện hai lần. Tôi đã không thử nó nhưng điều này có thể làm tăng dấu chân của mã của bạn.

$(CC) -o myApp -lfoo -lbar -lfoo 

Tôi không biết điều này có hiệu quả với tiếng kêu hay không nhưng nó có thể đáng để chụp.

Giải pháp tốt nhất sẽ loại bỏ phụ thuộc vòng tròn vì nó sẽ tạo ra cho bạn nhiều vấn đề hơn trong tương lai.

+0

Không bao giờ nên tăng kích thước mã :) – mlvljr

0

Tôi đã gặp sự cố tương tự liên kết với trình biên dịch tùy chỉnh bằng cách sử dụng dự án QT C++.

Vấn đề hóa ra là QT sử dụng clang (c compiler) hơn là clang ++ (C++ compiler). Bằng cách định nghĩa trình biên dịch như clang ++ thay vì clang trong dự án QT (thiết lập QMAKE_CXX = clang ++), dự án được liên kết thành công.

Như tôi đã hiểu, điều này cũng đúng với gcc và g ++.

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