Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake中OpenSSL加密的静态链接_Cmake_Openssl_Static Linking - Fatal编程技术网

CMake中OpenSSL加密的静态链接

CMake中OpenSSL加密的静态链接,cmake,openssl,static-linking,Cmake,Openssl,Static Linking,我需要为MIPS设备制作一个交叉编译的OpenSSL。我试着按照文档进行操作。将OPENSSL\u USE\u STATIC\u LIBS设置为true,并将target\u link\u libraries设置为所需的库文件 CMakeLists.txt: compileAsC99() if(NOT ${use_http}) message(FATAL_ERROR "program being generated without HTTP support") endif() set

我需要为MIPS设备制作一个交叉编译的OpenSSL。我试着按照文档进行操作。将
OPENSSL\u USE\u STATIC\u LIBS
设置为true,并将
target\u link\u libraries
设置为所需的库文件

CMakeLists.txt:

compileAsC99()

if(NOT ${use_http})
    message(FATAL_ERROR "program being generated without HTTP support")
endif()

set(program_c_files
    ...
)

set(program_h_files
    ...
)

include_directories(...)

add_executable(program ${program_c_files} ${program_h_files})

set(OPENSSL_USE_STATIC_LIBS TRUE)
#target_link_libraries(program OpenSSL::Crypto)
target_link_libraries(program /home/program/mips/lib/libssl.so.1.1)
target_link_libraries(program /home/program/mips/lib/libcrypto.so.1.1)
compileAsC99()

if(NOT ${use_http})
    message(FATAL_ERROR "program being generated without HTTP support")
endif()

set(program_c_files
    ...
)

set(program_h_files
    ...
)

include_directories(...)

add_executable(program ${program_c_files} ${program_h_files})

find_package(OpenSSL REQUIRED)
if(OPENSSL_FOUND)
set(OPENSSL_USE_STATIC_LIBS TRUE)
message("OPENSSL FOUND!")
endif()
target_link_libraries(program OpenSSL::Crypto)
它编译得很好,没有警告,但检查生成的二进制文件告诉我它仍然是共享库

readelf-d程序:

Dynamic section at offset 0x1bc contains 35 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libssl.so.1.1]
 0x00000001 (NEEDED)                     Shared library: [libcrypto.so.1.1]
 0x0000000f (RPATH)                      Library rpath: [/home/program/mips/lib]
我不明白我做错了什么

编辑:已经看过了,但没有告诉我任何新的东西

编辑2:根据回复更新了CMakeLists.txt文件: CMakeLists.txt:

compileAsC99()

if(NOT ${use_http})
    message(FATAL_ERROR "program being generated without HTTP support")
endif()

set(program_c_files
    ...
)

set(program_h_files
    ...
)

include_directories(...)

add_executable(program ${program_c_files} ${program_h_files})

set(OPENSSL_USE_STATIC_LIBS TRUE)
#target_link_libraries(program OpenSSL::Crypto)
target_link_libraries(program /home/program/mips/lib/libssl.so.1.1)
target_link_libraries(program /home/program/mips/lib/libcrypto.so.1.1)
compileAsC99()

if(NOT ${use_http})
    message(FATAL_ERROR "program being generated without HTTP support")
endif()

set(program_c_files
    ...
)

set(program_h_files
    ...
)

include_directories(...)

add_executable(program ${program_c_files} ${program_h_files})

find_package(OpenSSL REQUIRED)
if(OPENSSL_FOUND)
set(OPENSSL_USE_STATIC_LIBS TRUE)
message("OPENSSL FOUND!")
endif()
target_link_libraries(program OpenSSL::Crypto)
输出:

-- IoT Client SDK Version = 1.2.11
-- Provisioning client OFF
-- target architecture: GENERIC
-- Cross compiling not using pkg-config
-- Found CURL: /home/program/mips/lib/libcurl.a (found version "7.63.0")
-- Found CURL: /home/program/mips/lib/libcurl.a
-- target architecture: GENERIC
-- target architecture: GENERIC
-- target architecture: GENERIC
-- target architecture: GENERIC
-- iothub architecture: GENERIC
OPENSSL FOUND!
-- Configuring done
-- Generating done

编辑繁荣: 如果您,未来的人们,遇到了对dlopen的
未定义引用
,我将以下内容添加到我的
CMakeLists.txt
文件中

target_link_libraries(program ${CMAKE_DL_LIBS})

设置为TRUE时,变量
OPENSSL\u使用\u STATIC\u LIBS
强制
find\u package(OPENSSL)
搜索静态库。因此,此变量仅适用于该调用,如果使用其结果:

set(OPENSSL_USE_STATIC_LIBS TRUE)
find_package(OpenSSL REQUIRED)
target_link_libraries(program OpenSSL::Crypto)


如果您已经执行了
cmake
,但未设置
OPENSSL\u USE\u STATIC\u LIBS
,则需要在新尝试之前删除cmake缓存(
CMakeCache.txt
,位于构建目录下)。否则,将使用已找到的(共享!)库,并且不会执行重新搜索。

仍然不起作用。它似乎可以根据构建日志找到正确的
ssl
crypto
库文件,但是
readelf
仍然报告这些文件是共享的。尝试完全删除“cmake”文件夹,并在不做任何更改的情况下重建所有内容。是否需要在某个地方设置另一个标志?“根据构建日志,似乎可以找到正确的
ssl
crypto
库文件”-请显示日志的该部分,从中可以找到库是静态的还是共享的。另外,正如您在代码
target\u link\u库(program OpenSSL::Crypto)
中所做的那样,您没有使用
target\u link\u库(program/home/program/mips/lib/libssl.so.1.1)
,是吗?用输出更新了我的帖子并修改了
CMakeLists.txt
。输出包含
libcurl
的静态库,但是您的问题在于
libssl
libcrypto
。请注意,在您更新的代码中,您使用的是相关问题,而不是我的问题。我已经为这个答案添加了注释,为什么它是可疑的。链接总是通过
target\u link\u库执行的。但是为了搜索库(而不是硬编码到它们的路径),您可以使用任何可用的方法。如果库支持
查找包(XXX)
,则使用该命令。如果可以使用
pkg config
命令行实用程序找到库,则使用。如果库不支持任何搜索机制,请求助于
find\u library