a

Câu hỏi làm thế nào để làm liên kết tĩnh của libwinpthread-1.dll trong mingw?


Tôi sử dụng mingw từ đây: http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.7.2/32-bit/threads-posix/sjlj/x32-4.7.2-release-posix-sjlj-rev2.7z/download

Và tôi đã quản lý thành công liên kết tĩnh libstdc++-6.dll và libgcc_s_sjlj-1.dll bằng cách sử dụng -static-libgcc -static-libstdc++ các thông số, nhưng tôi không thể tìm thấy lệnh để thực hiện tương tự libwinpthread-1.dll.


42
2017-12-07 18:00


gốc


Chỉ vì mục đích kỹ thuật rõ ràng, nếu bạn đang liên kết tĩnh, bạn không liên kết đến DLL. Các thư viện libgcc và libstdc++ có các phiên bản tĩnh và không tĩnh (DLL), và nếu bạn liên kết tĩnh, bạn không liên kết đến các tệp DLL. Bạn muốn liên kết tĩnh với pthreads thư viện, không phải libwinpthread-1.dll (vì bạn không thể liên kết tĩnh với một thư viện động ... mà đánh bại mục đích của một thư viện động). - Cornstalks
Tôi có: c++: error: unrecognized command line option '-static-pthreads' , cùng với winpthreads - rsk82
Quick gotcha: libwinpthread-1.dll đi kèm với mingw không giống với một (s) vòng nổi trên internet. Sử dụng sai sẽ dẫn đến một cuộc gọi DLL đệ quy vô hạn (theo phụ thuộc walker) theo sau là một tràn ngăn xếp. - Mohan


Các câu trả lời:


Bạn có lẽ nên kiểm tra tài liệu tùy chọn dòng lệnh cho GCC.

Đây không phải lệnh '-static-something', chỉ có các thư viện chuẩn (libgcc và libstdc ++) mới có thể được đặt thành liên kết tĩnh với một lệnh. Đối với các thư viện khác, trước tiên bạn chuyển sang liên kết tĩnh với "-static" và sau đó liệt kê các thư viện để bao gồm với các lệnh riêng biệt, tức là "-lpthread".


18
2017-12-25 14:22



Tôi thấy rằng vấn đề này nổi lên khi tôi chuyển từ sử dụng một phiên bản của mingw tôi đã tải xuống phiên bản được cài đặt bởi apt-get trên Ubuntu. Phiên bản apt-get cũ hơn nhưng tôi nghĩ rằng vấn đề phát sinh từ một cấu hình khác được sử dụng để xây dựng bộ công cụ mingw. Thêm "-static -lpthread" đã khắc phục được sự cố. - nmgeek
libgcc không phải là thư viện chuẩn. Xem đây - Paolo M


Nếu toolchain của bạn bao gồm các winpthread tĩnh, hãy thêm tùy chọn

-static

Sẽ kéo các phiên bản tĩnh của tất cả các thư viện mà nó có thể.

Ngoài ra, bạn có thể loại bỏ libwinpthread.dll.a và bản thân DLL từ các thư mục chuỗi công cụ. Điều này có thể làm hỏng các chương trình liên kết với libstdc ++ và libgcc DLL mặc dù vậy, hãy cẩn thận.

Tùy chọn thứ ba là sử dụng -Wl,-Bdynamic và -Wl,-Bstatic để chọn phiên bản bạn muốn liên kết trong (đó là những gì -static trong nội bộ khi ld được gọi). Một ví dụ:

gcc -o someexec someobject.o -Wl,-Bdynamic -lsomelibIwantshared -Wl,-Bstatic -lsomelibIwantstatic

Nếu bạn chạy lệnh liên kết của bạn với -v được thêm vào, bạn sẽ thấy các tùy chọn này xuất hiện trong lời gọi ld / collect2 khi bạn sử dụng -static-libgcc và -static-libstdc++.


37
2017-12-25 20:08



Cảm ơn nhiều! - kometen
Điều đó làm việc tốt với tôi với MinGW64. - Spiralwise


Thử cái này:

-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic

Lưu ý -lstdc++ trước -lpthread. Nó làm việc cho tôi.

Hãy chắc chắn để thêm này vào cuối của bạn g++ dòng lệnh.


22
2018-01-17 15:56



Điều này không làm việc cho tôi, thật không may, trừ khi tôi xóa dấu -Wl,-Bdynamic (đó là vô nghĩa). - rr-
@ rr- Hãy thử sử dụng gcc -v để in ra thông tin chi tiết, gửi cho tôi. Và tôi sẽ xem xét nó. - Star Brilliant
Tôi nghĩ rằng tôi nhận được nó ... Tôi cần libwinpthread-1.dll chỉ khi tôi biên dịch với tĩnh libstdc++, có nghĩa là trong môi trường của tôi (kho lưu trữ và kho chính thức) phiên bản tĩnh của libstdc ++ phụ thuộc vào winpthread chia sẻ. Để giải quyết vấn đề này, tôi có thể cần phải tự biên dịch mingw-w64. - rr-
@ rr- Tôi vui vì bạn đã tìm ra. Hãy cho tôi biết nếu bạn giải quyết nó. (Ngoài ra, tôi chỉ sử dụng ArchLinux bây giờ mà không có vấn đề gì.) - Star Brilliant
@ rr- Tôi nghĩ bạn nên thêm nhận xét của mình làm câu trả lời. Tôi lãng phí một phần của buổi chiều để tìm hiểu điều này. - erreka


Để liên kết tĩnh winpthread ngay cả khi luồng không được sử dụng trong chương trình, hãy vượt qua -Bstatic và --whole-archive tham số cho trình liên kết:

g++ -o hello.exe hello.cpp -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive

Lưu ý những điều dưới đây:

  • Tùy chọn "toàn bộ lưu trữ" sẽ bị tắt ngay sau đó.
  • Bạn không cần phải thực hiện việc này nếu chương trình của bạn thực sự sử dụng các biểu tượng từ thư viện (tức là bạn sử dụng <thread> từ C ++ 11), trong trường hợp đó, thư viện sẽ không bị xóa khi bạn liên kết tĩnh nó.
  • Bản hack này dành cho MinGW-w64, để sửa lỗi libwinpthread-1.dll phụ thuộc.

10
2018-04-13 21:52





Đối với bất kỳ ai làm việc trong CMake, giải pháp này dễ dàng được triển khai trong tệp CMakeLists.txt của bạn như sau ...

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")

1
2018-03-23 14:58





Rõ ràng, CMake làm một số thứ kỳ lạ với cách -Wl cờ biên dịch được xử lý, làm cho -Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic giải pháp không hoạt động, chỉ với hai tùy chọn khác dường như còn lại: cờ trình biên dịch kém -static và cờ trình biên dịch xấu xí -Wl,--whole-archive.

Trong khi đó, lựa chọn tốt thực sự hoạt động trong CMake, nhưng dường như không có giấy tờ, là sử dụng trực tiếp các cờ liên kết. Do đó, trong CMake, đây có vẻ là cách tốt nhất để liên kết tĩnh tới tất cả các phụ thuộc của mingw-w64 C ++:

target_link_libraries (MyVeryAwesomeApp -static gcc stdc++ winpthread -dynamic)

Cần lưu ý rằng ngay cả khi không có thư viện theo dõi rõ ràng -dynamic, nó vẫn nên được áp dụng để đảm bảo rằng các thư viện chuẩn, ngầm được liên kết được liên kết chính xác.


0
2017-07-30 21:09





Tôi đã từng gặp vấn đề tương tự. Tôi đang sử dụng Code :: Blocks, và tôi đã thành công bằng cách thêm một dòng bổ sung trong commmands liên kết:

-lpthread -L libwinpthread-1.dll

Lệnh này sẽ được thêm vào bất cứ nơi nào bạn thực hiện các lệnh liên kết khác như:

-static-libgcc
-static-libstdc++

Tôi không nhận được lỗi biên dịch hoặc cảnh báo khi thực hiện lệnh này. Chỉ thị đầu tiên, -lọc, chỉ định tệp tiêu đề và chỉ thị theo sau, -L, được sử dụng để liên kết một tệp cụ thể.

Tôi đang sử dụng phiên bản gcc 4.8.1. Phiên bản sau này có sửa lỗi cho * to_string *, ví dụ như tôi cần.


-2
2018-01-31 02:33



Theo tinh thần tiết lộ đầy đủ, tôi đã thử nghiệm exe với dòng "-lpthread ..." ở trên, và nó vẫn tạo ra lỗi runtime của một libwinpthread-1.dll bị thiếu. Dòng không tạo ra lỗi nào với trình liên kết. Lệnh "-static" chung, một câu trả lời khác về chủ đề này, là giải pháp đầu tiên mà tôi đã tìm thấy cho đến nay. - yellowjacket05
@rubenvb dường như bạn đã không đọc bình luận của tôi trước đây. - yellowjacket05
-L là đường dẫn thư viện (nghĩa là nó được coi là một thư mục). - Alexandre Pereira Nunes


Chỉ cần thêm -static cho bạn CFLAGS.

Ví dụ: ./configure CFLAGS="-static".

Điều này sẽ liên kết tất cả các thư viện tĩnh với tệp thi hành của bạn.


-2
2017-10-22 23:57



CFLAGS không nên ảnh hưởng đến các lệnh liên kết ... - rubenvb