cmake find_path не работает в Windows

#cmake

#cmake

Вопрос:

в моем первом проекте cmake похоже, что find_path не работает в Windows, когда я пытаюсь ссылаться на пакет libcurl. я использую cmake 2.8.12.2.

я взглянул на исходный код FindCURL.cmake и попробовал ниже:

 if(WIN32)
set(CMAKE_PREFIX_PATH 
    "${WIN32_LIBS_DIR}/libcurl" 
    "${WIN32_LIBS_DIR}/libcurl/include" 
    "${WIN32_LIBS_DIR}/libcurl/lib"
    )
find_path(CURL_INCLUDE_DIR NAMES curl/curl.h)   # this line is copied from the first line of FindCURL.cmake source

    message("WIN32_LIBS_DIR: ${WIN32_LIBS_DIR}")
message("thu ${CURL_INCLUDE_DIR}")
 

и получите результат

 WIN32_LIBS_DIR: ../../../lwqq_root/win32-dev
"thu CURL_INCLUdE_DIR_NOTFOUND", 
 

кстати, переменная WIN32_LIBS_DIR имеет значение win32-dev, которое выглядит следующим образом:

 └─win32-dev
   ├─libcurl
   │  ├─bin
   │  ├─include
   │  │  └─curl
   │  │     └─curl.h
   │  ├─lib
   │  │  └─pkgconfig
   │  └─samples
 

есть идеи, почему?

Комментарии:

1. Вы пробовали использовать find_path(CURL_INCLUDE_DIR NAMES curl.h) вместо этого?

2. Это должно сработать. Вы уверены , что «<…>win32-dev libcurlincludecurl curl.h» существует, и это message("WIN32_LIBS_DIR: ${WIN32_LIBS_DIR}") показывает, что WIN32_LIBS_DIR установлен правильный путь?

3. find_path(CURL_INCLUDE_DIR ИМЕНУЕТ curl / curl.h) эта строка взята из исходного файла cmake, теоретически я не должен это менять. хотя я только что попробовал и увидел ту же ошибку.

4. WIN32_LIBS_DIR абсолютно корректен.

5. У меня та же настройка, что и у вас (хотя я использую CMAKE_FIND_ROOT_PATH), и она работала отлично вплоть до cmake 2.8.12.2. Вы когда-нибудь решали ее? Он по-прежнему не работает в cmake 3.0.

Ответ №1:

Современный способ использования CURL — использовать импортированные целевые объекты, созданные FindCURL и для руководства поиском CURL_ROOT , например, так:

 set(CURL_ROOT "${WIN32_LIBS_DIR}")
find_package(CURL REQUIRED)

add_executable(my_target main.cpp)
target_link_libraries(my_target PRIVATE CURL::libcurl)
 

Смотрите: https://cmake.org/cmake/help/latest/module/FindCURL.html


Ваш вопрос не содержит достаточно подробностей, чтобы воспроизвести вашу проблему. Вот что я сделал, чтобы попробовать:

 cmake_minimum_required(VERSION 3.20)
project(test LANGUAGES NONE)

# Create the directory structure in the question:
file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/win32-dev/libcurl/bin")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/win32-dev/libcurl/include/curl")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/win32-dev/libcurl/lib/pkgconfig")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/win32-dev/libcurl/samples")

file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/win32-dev/libcurl/include/curl/curl.h" "")

# Set WIN32_LIBS_DIR to the root just created
set(WIN32_LIBS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/win32-dev")

# Your code:
set(
  CMAKE_PREFIX_PATH
  "${WIN32_LIBS_DIR}/libcurl" 
  "${WIN32_LIBS_DIR}/libcurl/include" 
  "${WIN32_LIBS_DIR}/libcurl/lib"
)

find_path(CURL_INCLUDE_DIR NAMES curl/curl.h)

message(STATUS "WIN32_LIBS_DIR: ${WIN32_LIBS_DIR}")
message(STATUS "CURL_INCLUDE_DIR ${CURL_INCLUDE_DIR}")
 

Это было в Windows с CMake 3.20, но я уверен, что это сработает, если вернуться назад. Я тестировал это в Linux с каждой версией CMake между 3.0 и 3.20, и это сработало на всех из них.

Вот что я вижу в терминале:

 D:test>cmake -S . -B build
-- Building for: Visual Studio 16 2019
-- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.19043.
-- WIN32_LIBS_DIR: D:/test/win32-dev
-- CURL_INCLUDE_DIR D:/test/win32-dev/libcurl/include
-- Configuring done
-- Generating done
-- Build files have been written to: D:/test/build

D:test>tree /F win32-dev
Folder PATH listing for volume Sources
Volume serial number is 0000008F 943F:828D
D:TESTWIN32-DEV
└───libcurl
    ├───bin
    ├───include
    │   └───curl
    │           curl.h
    │
    ├───lib
    │   └───pkgconfig
    └───samples
 

Как вы можете видеть из выходных данных, я точно отразил ваш макет каталога, и те же настройки других переменных позволили find_path добиться успеха даже в Windows.