Vấn đề: Tôi đang xây dựng một dự án bên ngoài trong CMake. Dự án có một Makefile mà cuối cùng tạo ra một đối tượng được chia sẻ. Tôi muốn liên kết và cài đặt đối tượng này trong dự án siêu của tôi, giống như thể nó là một trong các thư viện trong dự án. Vấn đề là lib ExternalProject được liên kết vào các ứng dụng và thư viện của tôi với một đường dẫn tương đối, không phải là đường dẫn tuyệt đối gây ra vấn đề khi chạy từ bất kỳ thư mục nào ngoài CMake đặt nó.CMake: Liên kết đối tượng chia sẻ C++ từ ExternalProject tạo ra các tệp nhị phân với đường dẫn tương đối, không tuyệt đối
Tôi có created a sample SSCCE example project để minh họa thiết lập tổng thể của tôi. Vui lòng đọc và biên dịch nếu cần (git clone https://github.com/calebwherry/cmake-SO-question-main --recursive && cd cmake-SO-question-main && mkdir build && cd build && cmake .. && make && cd src/app/testApp && ldd testApp
).
Bất cứ khi nào tôi chạy ldd
trên thực thi và libs, tôi nhận được kết quả như thế này:
linux-vdso.so.1 => (0x00007fff8b5a2000)
libTestLib.so => /home/jwherry3/repos/cmake-superprj-main-test/build/src/lib/TestLib/libTestLib.so (0x00007f592da57000)
../../lib/libExtLib.so (0x00007f592d855000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f592d539000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f592d2b7000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f592d0a0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f592cd14000)
/lib64/ld-linux-x86-64.so.2 (0x00007f592dc5a000)
Tôi đã thử tất cả mọi thứ đối phó với RPATHS nhưng không thể có được ExtLib để liên kết đúng. Các lib là địa phương cho các dự án (libTestLib.so
) liên kết tốt.
Tôi cũng đã cố gắng đặt LD_LIBRARY_PATH
để ghi đè đường dẫn tương đối khi tôi chạy ứng dụng nhưng ngay cả khi tôi làm điều đó, nó vẫn không tìm thấy thư viện. Tôi cho rằng vì nó là tương đối nó không theo thứ tự liên kết bình thường? Kết quả là nhị phân sẽ không chạy trừ khi tôi nằm trong thư mục chứa nó.
Tôi cảm thấy như tôi đang làm điều gì đó thực sự câm khi tạo phụ thuộc với ExternalProject và đó là vấn đề của tôi nhưng tôi đã đánh bại đầu của tôi trong 3 ngày và đã không đưa ra bất cứ điều gì.
Thiết lập hệ thống: Debian Wheezy 64 bit, CMake 3.0.2, g ++ - 4.9.2.
Vẫn không có lần truy cập, phải không? Whelp, tôi đã tạm thời 'cố định' vấn đề bằng cách có dự án bên ngoài cũng xây dựng một lib tĩnh và liên kết mà thay vì lib được chia sẻ. Không phải là một giải pháp lâu dài nhưng một trong đó ít nhất được điều này để chạy một cách chính xác. Tôi đã cập nhật repo để có tùy chọn này cho người khác nhưng bạn phải tự thay đổi nó trong ext/CMakeLists.txt để bật nó lên. – Caleb
xin lỗi, không nhận thấy câu trả lời – Slava