2013-02-02 42 views
9

Tôi cố gắng xây dựng chương trình với các thư viện chuỗi công cụ liên kết tĩnh. Tôi vượt qua:Liên kết tĩnh với libwinpthread

LDFLAGS="-Wl,-Bstatic -lwinpthread -Wl,-Bdynamic -static-libgcc -static-libstdc++" 

nhưng chương trình được liên kết với chia sẻ libwinpthread-1.dll.

Tôi đang làm gì sai?

Cách duy nhất khi tôi nhận được libwinpthreads được liên kết tĩnh là vượt qua -static đến LDFLAGS. Nhưng nó phá vỡ chương trình xây dựng với hệ thống plugin.

tôi sử dụng mingw-w64 + GCC-4.7.2 từ dự án MinGW-xây dựng: http://sourceforge.net/projects/mingwbuilds/

+1

Tôi không biết lý do tại sao 'tùy chọn -Bstatic' dường như không làm việc, nhưng có thể bạn có thể nhận được những gì bạn muốn bằng cách xác định các tập tin thư viện cụ thể thay vì để' tìm kiếm ld' cho nó: http : //stackoverflow.com/a/14494371/12711 –

+2

Trong bản phân phối MinGW của tôi, kho lưu trữ tĩnh được gọi là 'libpthread.a' (vâng, cái động là' libwinpthread-1.dll' quá), do đó tôi muốn sử dụng '-lpthread'.Có lẽ điều tương tự cũng hợp lệ với bạn. –

+0

Có thể trùng lặp của [làm thế nào để làm liên kết tĩnh của libwinpthread-1.dll trong mingw?] (Https://stackoverflow.com/questions/13768515/how-to-do-static-linking-of-libwinpthread-1-dll -in-mingw) –

Trả lời

1

Bạn đang không làm bất cứ điều gì không đúng, MinGW-xây dựng công trình theo cách đó bạn.

Gần đây tôi đã vấp vào điều này, nhưng vì lý do khác:

MinGW-xây dựng tự động liên kết thực thi để GCC thư viện động (libwinpthread-1.dll, libstdC++ - 6.dll, libgcc_s_dw2-1.dll) để lưu kích thước thực thi (vấn đề: khi bạn phát hành các tệp thi hành, bạn phải nhớ thêm các tệp dll bị thiếu cùng với tệp nhị phân của bạn vì không có người dùng bảo đảm có các DLL đó trên hệ thống của họ)

Trong trường hợp của tôi, tôi có nhiều GCC pakcages trên cùng một hệ thống và do đó tôi không thêm chúng vào PATH để tránh xung đột tên. Một phần thú vị là CMAKE trước khi cấu hình dự án của bạn tạo ra một C-SourceFile được biên dịch và sử dụng để nhận thông tin về trình biên dịch của bạn, vì DLL không có trong PATH, thực thi nhỏ do CMake tạo ra đã bị lỗi do thiếu DLL và điều đó đã ngăn chặn toàn bộ quá trình xây dựng.

Giải pháp khắc phục là thêm đường dẫn trình biên dịch vào PATH TEMPORARILY (hoặc chạy CMake tốt hơn trong môi trường khác).

Thêm DLL thủ công vào thư mục tạm cmake không hoạt động vì cmake dọn dẹp thư mục đó ở mỗi cấu hình ..

Nếu bạn sử dụng mingwbuilds bạn phải liên kết đến pthreadBLAH.dll không workaround

7

Hãy thử điều 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.

Đảm bảo thêm phần này vào cuối dòng lệnh g++ của bạn.

+0

làm việc cho tôi: gcc 4.9.2 trên x64 – cap

+0

Tại sao -lstdC++ trước khi -pthread khi chúng ta đã có -static-libstdC++ ?? –

+0

@ kawing-chiu Tôi không biết. Nó chỉ hoạt động, và nếu tôi thay đổi thứ tự nó phá vỡ. ;-) –

0

Không lý tưởng nhưng nếu bạn không nhớ plonking DLL thời gian chạy của bạn trong cùng một thư mục như thực thi của bạn, bạn có thể thêm một cái gì đó như thế này trong tập tin CMakeLists.txt của bạn. Điều này sẽ sao chép các DLL cần thiết từ thư mục bin MingW vào thư mục build hiện tại.

# ... 
# change to name of your project 
set(TARGET_NAME ${PROJECT_NAME}) 
# change to path to your minw bin directory 
set(MINGW_BIN_PATH "C:\\Program Files\ \(x86\)\\mingw-w64\\i686-4.9.2-posix-dwarf-rt_v3-rev1\\mingw32\\bin") 

set(LIBGCC_DLL "${MINGW_BIN_PATH}\\libgcc_s_dw2-1.dll") 
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
        ${LIBGCC_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>) 
set(LIBSTDCPP_DLL "${MINGW_BIN_PATH}\\libstdc++-6.dll") 
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
        ${LIBSTDCPP_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>) 
set(LIBWINPTHREAD_DLL "${MINGW_BIN_PATH}\\libwinpthread-1.dll") 
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
        ${LIBWINPTHREAD_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>)