gpt4 book ai didi

cmake find_path 在 Windows 上不起作用

转载 作者:行者123 更新时间:2023-12-04 14:21:36 24 4
gpt4 key购买 nike

在我的第一个 cmake 项目中,当我尝试引用包 libcurl 时,find_path 在 Windows 上似乎不起作用。我正在使用 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

知道为什么吗?

最佳答案

使用 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}")
这是在带有 CMake 3.20 的 Windows 上,但我相信它会工作回去。我在 Linux 上使用 3.0 和 3.20 之间的每个 CMake 版本对此进行了测试,并且它对所有版本都有效。
这是我在终端中看到的:
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:\TEST\WIN32-DEV
└───libcurl
├───bin
├───include
│ └───curl
│ curl.h

├───lib
│ └───pkgconfig
└───samples
从输出中可以看出,我已经完全镜像了您的目录布局,并且其他变量的相同设置允许 find_path成功,即使在 Windows 上。

关于cmake find_path 在 Windows 上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24332152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com