在ArchLinux上交叉编译Windows平台Drogon框架C++ HTTP服务器遇阻
交叉编译Drogon HTTP服务器到Windows平台的依赖查找问题
在ArchLinux上使用Drogon框架编译面向Windows的C++ HTTP服务器,已安装mingw64系列工具,参考CMake交叉编译文档配置了工具链,但添加-DCMAKE_TOOLCHAIN_FILE参数执行CMake时,find_package()无法找到Drogon包。本地用clang++编译(不指定工具链)完全正常。
主CMakeLists.txt代码
cmake_minimum_required(VERSION 3.5) project(lru_server CXX) include(CheckIncludeFileCXX) check_include_file_cxx(any HAS_ANY) check_include_file_cxx(string_view HAS_STRING_VIEW) check_include_file_cxx(coroutine HAS_COROUTINE) if (NOT "${CMAKE_CXX_STANDARD}" STREQUAL "") # Do nothing elseif (HAS_ANY AND HAS_STRING_VIEW AND HAS_COROUTINE) set(CMAKE_CXX_STANDARD 20) elseif (HAS_ANY AND HAS_STRING_VIEW) set(CMAKE_CXX_STANDARD 17) else () set(CMAKE_CXX_STANDARD 14) endif () set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) add_executable(${PROJECT_NAME} main.cpp) target_include_directories(${PROJECT_NAME} PUBLIC lru_cache/ endpoints/ ) target_sources( ${PROJECT_NAME} PUBLIC lru_cache/lru_cache.cpp endpoints/ApiController.cpp ) find_package(Drogon CONFIG REQUIRED) target_link_libraries(${PROJECT_NAME} PRIVATE Drogon::Drogon) if (CMAKE_CXX_STANDARD LESS 17) # With C++14, use boost to support any, string_view and filesystem message(STATUS "use c++14") find_package(Boost 1.61.0 REQUIRED) target_link_libraries(${PROJECT_NAME} PUBLIC Boost::boost) elseif (CMAKE_CXX_STANDARD LESS 20) message(STATUS "use c++17") else () message(STATUS "use c++20") endif () aux_source_directory(controllers CTL_SRC) aux_source_directory(filters FILTER_SRC) aux_source_directory(plugins PLUGIN_SRC) aux_source_directory(models MODEL_SRC) drogon_create_views(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/views ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/models) target_sources(${PROJECT_NAME} PRIVATE ${SRC_DIR} ${CTL_SRC} ${FILTER_SRC} ${PLUGIN_SRC} ${MODEL_SRC})
工具链文件(TC-mingw.cmake)
# 目标操作系统名称 set(CMAKE_SYSTEM_NAME Windows) # 指定C/C++编译器 set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) # 目标环境路径 set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32 /usr/x86_64-w64-mingw32/lib /usr/lib /usr/lib/cmake /usr/lib/cmake/Drogon) # 调整FIND_XXX()命令的默认行为: # 在宿主机环境中搜索程序 # set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # 在目标环境中搜索头文件和库 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
执行的CMake命令
cmake -S /var/repo/lru_cpp_rest_server/lru_server -B /var/repo_build/lru_cpp_rest_server/build-lru_server-MinGW64 -DCMAKE_TOOLCHAIN_FILE=/var/repo/lru_cpp_rest_server/lru_server/TC-mingw.cmake
首次错误输出
[20:01:45] @archlinux bin$ cmake -S /var/repo/lru_cpp_rest_server/lru_server -B /var/repo_build/lru_cpp_rest_server/build-lru_server-MinGW64 -DCMAKE_TOOLCHAIN_FILE=/var/repo/lru_cpp_rest_server/lru_server/TC-mingw.cmake CMake Warning (dev) at CMakeLists.txt:29 (target_sources): Policy CMP0076 is not set: target_sources() command converts relative paths to absolute. Run "cmake --help-policy CMP0076" for policy details. Use the cmake_policy command to set the policy and suppress this warning. An interface source of target "lru_server" has a relative path. This warning is for project developers. Use -Wno-dev to suppress it. CMake Error at CMakeLists.txt:42 (find_package): Could not find a package configuration file provided by "Drogon" with any of the following names: DrogonConfig.cmake drogon-config.cmake Add the installation prefix of "Drogon" to CMAKE_PREFIX_PATH or set "Drogon_DIR" to a directory containing one of the above files. If "Drogon" provides a separate development package or SDK, be sure it has been installed.
核心问题
为何使用工具链后,系统中已安装的Drogon无法被找到?
更新内容
调整工具链配置后,新的CMake执行错误输出:
[22:19:01] alxndrklbk@archlinux bin$ cmake -S /var/repo/lru_cpp_rest_server/lru_server/ -B build-lru_server-MinGW-Debug -DCMAKE_TOOLCHAIN_FILE=/var/repo/lru_cpp_rest_server/lru_server/TC-mingw.cmake -- The CXX compiler identification is GNU 12.2.0 -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/x86_64-w64-mingw32-gcc - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Looking for C++ include any -- Looking for C++ include any - found -- Looking for C++ include string_view -- Looking for C++ include string_view - found -- Looking for C++ include coroutine -- Looking for C++ include coroutine - not found CMake Warning (dev) at CMakeLists.txt:29 (target_sources): Policy CMP0076 is not set: target_sources() command converts relative paths to absolute. Run "cmake --help-policy CMP0076" for policy details. Use the cmake_policy command to set the policy and suppress this warning. An interface source of target "lru_server" has a relative path. This warning is for project developers. Use -Wno-dev to suppress it. -- Found Jsoncpp: /usr/x86_64-w64-mingw32/include CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR) Call Stack (most recent call
内容的提问来源于stack exchange,提问作者Alexander Kolbeko
相关产品推荐
相关产品推荐

