2016-02-18 24 views
5

Tôi muốn tĩnh liên kết các thư viện được liệt kê dưới đây:Liên kết tĩnh OpenSSL crypto thư viện trong CMake

set_target_properties(exec PROPERTIES LINK_SEARCH_START_STATIC 1) 
set_target_properties(exec PROPERTIES LINK_SEARCH_END_STATIC 1) 
set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) 

find_library(SODIUM_LIB libsodium.a REQUIRED) 
find_library(SSL_LIB libssl.a REQUIRED) 
find_library(CRYPTO_LIB libcrypto.a REQUIRED) 
find_library(DL_LIB libdl.a REQUIRED) 

message(${SODIUM_LIB}) 
message(${SSL_LIB}) 
message(${CRYPTO_LIB}) 

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++") 

target_link_libraries(
    exec 
    ${SODIUM_LIB} 
    ${SSL_LIB} 
    ${CRYPTO_LIB} 
    ${DL_LIB} 

Tôi không muốn thêm -static-CMAKE_EXE_LINKER_FLAGS, bởi vì trong trường hợp đó tất cả mọi thứ được liên kết tĩnh. CMake tìm thấy các thư viện tĩnh:

/usr/local/lib/libsodium.a 
/usr/lib/x86_64-linux-gnu/libssl.a 
/usr/lib/x86_64-linux-gnu/libcrypto.a 

và có vẻ như rằng mọi thứ đều được liên kết tĩnh trừ libcrypto:

readelf -d exec 
0x0000000000000001 (NEEDED)    Shared library: [libcrypto.so.1.0.0] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [ld-linux-x86-64.so.2] 

Làm thế nào tôi có thể liên kết libcrypto tĩnh để thực thi hay không?

+0

có bạn kiểm tra bạn thực sự tìm ra thư viện phải không? Ngoài ra nó có thể giúp tùy chọn xác định đường dẫn nơi mà thư viện tĩnh được tìm thấy. –

Trả lời

0

Các tài liệu CMake bắt đầu với phiên bản 3.4 trên FindOpenSSL page nói:

Set OPENSSL_USE_STATIC_LIBS TRUE để tìm kiếm các thư viện tĩnh.

(Giả sử nếu chúng được tìm thấy họ sẽ được sử dụng)

Ví dụ:

cmake_minimum_required(VERSION 3.4) 
project(Foo) 

set(SOURCE_FILES main.cpp) 

find_package(OpenSSL REQUIRED) 
if(OPENSSL_FOUND) 
set(OPENSSL_USE_STATIC_LIBS TRUE) 
endif() 

add_executable(${PROJECT_NAME} ${SOURCE_FILES}) 
target_link_libraries(${PROJECT_NAME} OpenSSL::Crypto) 
Các vấn đề liên quan