我试图交叉编译Linux上的Windows操作系统。我是通过CMake和x86_64-mingw-w64-g++实现这一点的。
我已经安装了dlfcn (也是vcpkg)来链接libdl,并且我意识到当这两者单独存在时,mingw-w64没有任何问题。
只有DL:
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:
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)我得到以下错误
[ 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
OPENSSL_LIBRARIEShttps://cmake.org/cmake/help/latest/module/FindOpenSSL.html
这是非常令人费解的,如果它帮助我使用vcpkg和使用完全静态库。
所有vcpkg都安装了以下三重奏:
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)发布于 2022-10-27 19:47:07
找到图书馆或诸如此类的东西没有问题。我只是简单地错误地链接了这些库:
find_library(crypt REQUIRED NAMES crypt32)
target_link_libraries(main ${crypt})不相关的包,但我意识到它是否是OpenSSL并不重要;如果交叉编译,需要设置正确的lib文件夹,并确保CMake引用的是正确的
message(${crypt})这将有助于验证您所引用的是正确的库,并且您必须链接它(如果顺序不正确,并且您得到了undefined reference错误,则可以通过在target_link_libraries中重复它来帮助您)。
对于mingw,安装vcpkg的目录也很有帮助,但是在/usr/ dir中添加文件是绝对必要的。如下所示:
set(CMAKE_LIBRARY_PATH ${CMAKE_PREFIX_PATH}/lib /usr/x86_64-w64-mingw32/lib)这样,您就可以将它们与其他体系结构的库混合起来。
而且最好让CMAKE_PREFIX_PATH主要是/usr/x86_64-w64-mingw32,因为作为主前缀(而不是vcpkg )更有意义。
https://stackoverflow.com/questions/74201780
复制相似问题