首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么CMake的OpenSSL不能识别libdl?(“找不到-ldl")

为什么CMake的OpenSSL不能识别libdl?(“找不到-ldl")
EN

Stack Overflow用户
提问于 2022-10-26 01:33:18
回答 1查看 32关注 0票数 0

我试图交叉编译Linux上的Windows操作系统。我是通过CMake和x86_64-mingw-w64-g++实现这一点的。

我已经安装了dlfcn (也是vcpkg)来链接libdl,并且我意识到当这两者单独存在时,mingw-w64没有任何问题。

只有DL:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.10)
project(main)

set(CMAKE_C_COMPILER /usr/bin/x86_64-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/x86_64-w64-mingw32-g++)

set(CMAKE_PREFIX_PATH /home/undulating/Manual_Programs/vcpkg/installed/x64-mingw-static)

add_executable(main main.cpp)


find_package(dlfcn-win32 CONFIG REQUIRED)
target_link_libraries(main PUBLIC dlfcn-win32::dl)

这很好,没有“缺少的-ldl”,一点也不像这样。效果很好。

但是,出于某种原因,mingw-w64无法在DL + OpenSSL中识别这一点。标准g++的情况并非如此。当我将DL和OPENSSL与g++结合在一起时,并没有“缺少的-ldl”,但是对于mingw,情况并非如此。

DL + OPENSSL:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.10)
project(main)
 
set(CMAKE_C_COMPILER /usr/bin/x86_64-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/x86_64-w64-mingw32-g++)
  
set(CMAKE_PREFIX_PATH /home/undulating/Manual_Programs/vcpkg/installed/x64-mingw-static)
 
add_executable(main main.cpp) 
find_package(dlfcn-win32 CONFIG REQUIRED)
target_link_libraries(main PUBLIC dlfcn-win32::dl)

find_package(OpenSSL REQUIRED)
target_link_libraries(main PUBLIC OpenSSL:SSL OpenSSL::Crypto)

我得到以下错误

代码语言:javascript
复制
[ 50%] Linking CXX executable main
/usr/bin/x86_64-w64-mingw32-ld: cannot find -ldl
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/main.dir/build.make:106: main] Error 1
make[1]: *** [CMakeFiles/Makefile2:95: CMakeFiles/main.dir/all] Error 2
make: *** [Makefile:103: all] Error 2

我可以看出链接dl不是问题,但是由于某种原因,OpenSSL无法找到绑定它的方法,我也不知道为什么。如何让OpenSSL识别libdl?

我尝试通过设置OpenSSL的CMake变量直接链接libdl.a/从而直接指向libdl

代码语言:javascript
复制
OPENSSL_LIBRARIES

https://cmake.org/cmake/help/latest/module/FindOpenSSL.html

这是非常令人费解的,如果它帮助我使用vcpkg和使用完全静态库。

所有vcpkg都安装了以下三重奏:

代码语言:javascript
复制
set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)
set(VCPKG_ENV_PASSTHROUGH PATH)

set(VCPKG_CMAKE_SYSTEM_NAME MinGW)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-27 19:47:07

找到图书馆或诸如此类的东西没有问题。我只是简单地错误地链接了这些库:

代码语言:javascript
复制
find_library(crypt REQUIRED NAMES crypt32)


target_link_libraries(main ${crypt})

不相关的包,但我意识到它是否是OpenSSL并不重要;如果交叉编译,需要设置正确的lib文件夹,并确保CMake引用的是正确的

代码语言:javascript
复制
message(${crypt})

这将有助于验证您所引用的是正确的库,并且您必须链接它(如果顺序不正确,并且您得到了undefined reference错误,则可以通过在target_link_libraries中重复它来帮助您)。

对于mingw,安装vcpkg的目录也很有帮助,但是在/usr/ dir中添加文件是绝对必要的。如下所示:

代码语言:javascript
复制
set(CMAKE_LIBRARY_PATH ${CMAKE_PREFIX_PATH}/lib /usr/x86_64-w64-mingw32/lib)

这样,您就可以将它们与其他体系结构的库混合起来。

而且最好让CMAKE_PREFIX_PATH主要是/usr/x86_64-w64-mingw32,因为作为主前缀(而不是vcpkg )更有意义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74201780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档