#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.