Tôi đang sử dụng CMake trong một dự án và tôi đang cố gắng liên kết tĩnh một số thư viện. Tôi đã đặt:CMake và Liên kết tĩnh
set(BUILD_SHARED_LIBS OFF)
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
set_target_properties(icarus PROPERTIES LINK_SEARCH_END_STATIC 1)
Và tôi đã chắc chắn khi tìm kiếm các thư viện thực mà tôi có phiên bản * .a của chúng.
Hiện nay nhập khẩu dự án:
libPocoNet.a
libPocoUtil.a
libPocoXML.a
libPocoFoundation.a
libmysqlclient.a
libmysqlpp.a
libcrypto++.a
CUDA
Tất cả các thư viện được tìm thấy, và khi thực hiện một/chia sẻ liên kết năng động, họ làm việc tốt. Tôi cũng đã cố gắng đặt cờ biên soạn:
set(GCC_CXX_FLAGS ${GCC_CXX_FLAGS} "-static-libgcc -static-libstdc++ -static")
Nhưng vô ích. Trong khi tôi nhận được không có vấn đề khi biên dịch, liên kết được ném rất nhiều tài liệu tham khảo không xác định lỗi cho các cuộc gọi được tìm thấy trong các thư viện trên, tức là:
undefined reference to `mysql_thread_init'
undefined reference to `mysql_real_query'
undefined reference to `pthread_mutex_unlock'
undefined reference to `Poco::ErrorHandler::handle()'
Không theo thứ tự đặc biệt, và nhiều lỗi cho mỗi thư viện.
Nhìn vào dòng cuối cùng của GCC tôi thấy:
/usr/bin/c++ -g -g -static-libgcc -static-libstdc++ -static [list of *.cpp files]
-o icarus -rdynamic /usr/local/lib/libPocoFoundation.a /usr/local/lib/libPocoNet.a
/usr/local/lib/libPocoUtil.a /usr/local/lib/libPocoXML.a
-Wl,-Bstatic -lmysqlclient -lmysqlpp -lcrypto++
Mà làm cho tôi ngạc nhiên:
- Tại sao Poco thư viện liên kết như -rdynamic, và không có cờ -Bstatic -Wl ? Như thể chúng bị bỏ qua/loại trừ khỏi liên kết tĩnh.
- mysqlclient, mysqlpp và crypto ++ dường như được thiết lập cho liên kết tĩnh, nhưng tôi vẫn nhận được lỗi
Vì vậy, có thể ai đó xin vui lòng giải thích cho tôi:
- Làm thế nào để thiết lập cho liên kết tĩnh một phần sử dụng CMake
- Chỉ CMAKE_EXE_LINKER_FLAGS tôi có cần thiết lập chỉ số CMAKE_EXE_LINKER_FLAGS?
- Tôi có nên buộc liên kết tĩnh cho các thư viện được đề cập nhưng không phải cho toàn bộ dự án không?
Hãy tha thứ cho tôi nếu những câu hỏi quá nhiều hoặc quá cục bộ, tôi chưa thử điều này trước đây và dường như tôi không tìm thấy nhiều thông tin trên mạng.
Tôi nhận được một "/ usr/bin/ld: không thể tìm thấy -lc" (xây dựng trên CentOS 7) –
@MikeM Tôi thấy khó tin rằng thư viện C chưa được cài đặt. Có thể bạn cần xuất đường dẫn thư viện của mình? –
Tôi đã kết thúc hardcoding đường dẫn đến .a tập tin thông qua add_library (..) và nó làm việc cho tôi (cho cả hai tiêu đề và thư viện tĩnh) –