CMake find_package and NO_SYSTEM_ENVIRONMENT_PATH
CMake find_package and NO_SYSTEM_ENVIRONMENT_PATH
我正在使用cmake find_package查找在我的应用程序中使用的jpeg库。我确实有两个库的装置,即系统一个,位于:
上libjpeg: /usr/lib/x86_64-linux-gnu/libjpeg.a /usr/lib/x86_64-linux-gnu/libjpeg.so
和另一个定制位置:
/my/jpeg/instalation/lib/libjpeg.so
我想决定我应该使用命令行使用哪个版本。
例如,使用自定义一个我的cmake命令是:
cmake .. -DCMAKE_PREFIX_PATH=/my/jpeg/instalation
,仅查找系统的cmake命令将是:
cmake ..
和我的cmakelists.txt定义了cmake_prefix_path时具有类似的东西:
find_package(JPEG NO_SYSTEM_ENVIRONMENT_PATH REQUIRED)
并且当未定义CMAKE_PREFIX_PATH时:
find_package(JPEG REQUIRED)
但是,如果没有找到no_system_environment_path,找不到库...我假设使用此标志,系统路径被忽略了,但是似乎在cmake_prefix_path中声明的路径也被丢弃了...
基本上我想要何时指定不考虑系统库的CMAKE_PREFIX_PATH,并且当未指定CMAKE_PREFIX_PATH时,应考虑系统库...
我可以看到这为自定义路径工作的唯一方法是做这样的事情:
find_package(JPEG PATHS ${CMAKE_PREFIX_PATH} NO_DEFAULT_PATH)
但这也没有发现...我完全迷失了这个find_package行为...
ps:我正在使用CMAKE版本3.10.2,错误始终是:
CMake Error at CMakeLists.txt:7 (find_package):
Could not find a package configuration file provided by "JPEG" with any of
the following names:
JPEGConfig.cmake
jpeg-config.cmake
Add the installation prefix of "JPEG" to CMAKE_PREFIX_PATH or set
"JPEG_DIR" to a directory containing one of the above files. If "JPEG"
provides a separate development package or SDK, be sure it has been
installed.
更新
我未能意识到的是,find_package settins仅适用于find_package funcionality,这是,搜索findjpeg.cmake或jpegconfig.cmake.cmake脚本,而不是此脚本的内容。我想要的只有使用查找路径或文件的特定功能来完成,例如在tom示例中,但使用find_library这样:
set(CUSTOM_JPEG_PATH ON CACHE BOOL "use only custom paths")
set(JPEG_NAMES ${JPEG_NAMES} jpeg libjpeg)
if(CUSTOM_JPEG_PATH)
#find_package(JPEG REQUIRED
find_library(JPEG_LIBRARY NAMES ${JPEG_NAMES}
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH
)
else()
#find_package(JPEG REQUIRED
find_library(JPEG_LIBRARY NAMES ${JPEG_NAMES}
)
endif()
和这项工作如预期的(而不是给定自定义安装的根文件夹,我需要提供确切的位置 -/my/jpeg/instalation/lib-才能工作)。但这不是我想要的,我不想重写所有findxxx.cmake脚本以获取我想要的东西,这些发现脚本在它们的依赖项,编译标志等方面具有更多详细信息...所以我猜我猜没有办法只使用find_package(...)...
我希望它能在没有您的NO_SYSTEM_ENVIRONMENT_PATH
方法的情况下工作。只需使用find_package(JPEG REQUIRED)
即可。如果设置了CMAKE_PREFIX_PATH
,则Find_package将首先查看该目录。
如果您需要它,则可以为find_package
-CALL指定PATHS
或HINTS
:
set(CUSTOM_JPEG_PATH "" CACHE STRING "path to custom installation of libjpeg")
if(CUSTOM_JPEG_PATH)
find_package(JPEG REQUIRED
PATHS ${CUSTOM_JPEG_PATH}
NO_SYSTEM_ENVIRONMENT_PATH
)
else()
find_package(JPEG REQUIRED) #default search
endif()
使用vcpkg。最简单的是通过Project_options,它自动设置VCPKG并包括其工具链。
vcpkg覆盖了默认的cmake路径和环境变量,因此VCPKG提供的路径比系统优先。
vcpkg.json
{
"$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json",
"name": "myproject",
"version-string": "0.1.0",
"builtin-baseline": "70d3ac3a1754fffcd7d099b2b268bf7dfe70c162",
"dependencies": [
{
"name": "libjpeg-turbo",
"version>=": "2.0.6"
}
]
}
cmakelists.txt
cmake_minimum_required(VERSION 3.16)
# Add project_options v0.19.0
# https://github.com/cpp-best-practices/project_options
# Change the version in the following URL to update the package (watch the releases of the repository for future updates)
include(FetchContent)
FetchContent_Declare(_project_options URL https://github.com/cpp-best-practices/project_options/archive/refs/tags/v0.19.0.zip)
FetchContent_MakeAvailable(_project_options)
include(${_project_options_SOURCE_DIR}/Index.cmake)
run_vcpkg()
project(myproject LANGUAGES CXX C)
project_options(
# all the options you need
)
add_executable(myprogram main.cpp)
find_package(JPEG REQUIRED)
target_link_libraries(main PRIVATE ${JPEG_LIBRARIES})
target_include_directories(main PRIVATE ${JPEG_INCLUDE_DIR})
- 如何在c++中使用system()来运行包含空格的python脚本
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- C++/CLI System.AccessViolation在托管类中调用非托管函数时出现异常
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 程序在使用 system() 启动另一个可执行文件时停止
- 为什么我的 DeviceInformation 对象没有 System.Devices.InterfaceClassGuid 属性?
- 为什么"using System;"不被视为不良做法?
- C++ 合并字符串以'system'函数错误
- System.AccessViolationException:shared_ptr C# .NET 和 C++ 应用程
- 将 Vcl::Controls::TCaption aka (System::UnicodeString) 转换为 co
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- Python os.system() 返回错误值
- 使用 system() 函数在C++程序中运行 cmd 命令
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- system() 无法运行我的程序,因为空间
- How to recover system gcc compiler on centos 6
- 导出 c++ 函数并使用 c# System.AccessViolationException 中的函数
- g++ 中的 system() 函数
- 如何在 Windows 应用商店应用中从C++访问 System.Environment