如何在CMake中使用find_package()中的子目录VCPKG ?



我正在尝试从源代码构建PROJ。我没有它的许多动态依赖Centos 7,对我来说也不太可能获得这些依赖项通过系统软件包管理器。

为了避免这些问题,我尝试使用VCPKG。然而VCPKG在批次由于PROJ的混乱,我无法实际使用7.2以上的任何版本。x在VCPKG(我需要更新的功能),我也不能加载tiff(所以大多数非平凡的投影将直接不起作用)。所以我不能同时使用VCPKG和PROJ

然而,我仍然可以轻松地获得通过VCPKG运行PROJ所需的依赖项。

我试图将PROJ源转换为子目录,然而令我惊讶的是,尽管设置了-DCMAKE_TOOLCHAIN_FILE=... -DVCPKG_TARGET_TRIPLET=x64-linux,它仍然试图使用我的系统库。

我尝试使用目录作为一个独立的库,但与VCPKG变量设置,和…它工作。

所以我试着设置缓存变量,看看是否以某种方式没有向下传播,它没有工作(错误信息与下面相同)

set(CMAKE_TOOLCHAIN_FILE "/home/user/Documents/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "TEST")
set(VCPKG_TARGET_TRIPLET "x64-linux" CACHE STRING "TEST")
add_subdirectory(external/PROJ)

我的项目是这样设置的:

- CMakeLists.txt
- main.cpp
- external
- PROJ 
...

我的cmake是这样的:

cmake_minimum_required(VERSION 3.13)
project(test)
set(CMAKE_CXX_STANDARD 17)
add_subdirectory(external/PROJ)
add_executable(test main.cpp)
target_link_libraries(test PRIVATE PROJ::proj)

我一直得到

-- Found Sqlite3: /usr/lib64/libsqlite3.so
-- Sqlite3 version: 3.7.17
CMake Error at external/PROJ/CMakeLists.txt:180 (message):
sqlite3 >= 3.11 required!

当PROJ是子目录

我得到了正确的结果:
-- Found Sqlite3: /home/user/Documents/vcpkg/installed/x64-linux/debug/lib/libsqlite3.a
-- Sqlite3 version: 3.36.0

当我不使用它作为子目录。

在第一个project()调用之后,对于CMAKE_TOOLCHAIN_FILE来说,太迟了不能做任何有用的事情。实际上,如果在第一次project()调用之后发生变化,它甚至不会是read。Vcpkg、Conan等必须全局使用,否则根本不用。

你可以侥幸写这样的:

cmake_minimum_required(VERSION 3.21) # upgrade!! 3.13 is ancient
# Use vcpkg by default
if (EXISTS "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake")
set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
CACHE STRING "TEST")
set(VCPKG_TARGET_TRIPLET "x64-linux"
CACHE STRING "default vcpkg triplet")
endif ()
project(test)
set(CMAKE_CXX_STANDARD 17
CACHE STRING "C++ standard to use")
if (CMAKE_CXX_STANDARD LESS 17)
message(FATAL_ERROR "Must compile `test` with C++17 or newer")
endif ()
add_subdirectory(external/PROJ)
add_executable(test main.cpp)
target_link_libraries(test PRIVATE PROJ::proj)

通常设置环境变量VCPKG_ROOT指向vcpkg安装。

在摆弄了这个答案之后,我想知道为什么仍然不起作用,我试着在不同的目录下复制当前的MCVE。令我惊讶的是,它工作了,甚至可以使用缓存(普通的CMake命令行变量)。当使用PROJ作为sub_directory时,它实际上只将PROJ暴露为目标。然而,我试图使用PROJ::proj,这是一个显然由VCPKG制作的目标,用于链接他们的安装。好吧,我已经卸载了它,并且没有将它作为依赖项使用。尽管如此,在单独的构建文件夹中留下的文件显然会干扰我的安装,我的目录最初是这样的:

- CMakeLists.txt
- main.cpp
- external
- PROJ 
- cmake-build-debug
- cmake-build-release

嗯,VCPKG在这些目录中存储了一些关于包缓存之类的元信息。但是没有完全删除整个目录,我无法让它"忘记"。关于这个旧的安装。更重要的是,需要删除两个目录才能使其"完全";忘了proj吧

所以我删除了这些文件,像这样:

- CMakeLists.txt
- main.cpp
- external
- PROJ 

重置/重新加载CMake缓存和文件,并重新生成这些构建目录。

这样做之后,我不再需要担心这个额外的目标。

相关内容

  • 没有找到相关文章

最新更新