Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译OSL(开放着色语言)时出错,缺少OPENIMAGEIO\u库\u目录_C++_Cmake - Fatal编程技术网

C++ 编译OSL(开放着色语言)时出错,缺少OPENIMAGEIO\u库\u目录

C++ 编译OSL(开放着色语言)时出错,缺少OPENIMAGEIO\u库\u目录,c++,cmake,C++,Cmake,我无法按照此处的说明编译OSL: 该错误表示缺少环境变量OPENIMAGEIO_LIBRARY_DIRS。我尝试自己构建OpenImageIO或使用vcpkg。因此,我设置了所有其他缺少的变量,例如OPENIMAGEIO_库 如果我想设置OPENIMAGEIO_库目录,它应该指向哪里? 还有为什么它说它确实找到了变量,但它也说找到了 适用版本2.1.0,最低要求为1.8.5 以下是我在Mac上构建OSL时遇到的错误: -- Building OSL 1.11.0 -- CMake versio

我无法按照此处的说明编译OSL:

该错误表示缺少环境变量OPENIMAGEIO_LIBRARY_DIRS。我尝试自己构建OpenImageIO或使用vcpkg。因此,我设置了所有其他缺少的变量,例如OPENIMAGEIO_库 如果我想设置OPENIMAGEIO_库目录,它应该指向哪里? 还有为什么它说它确实找到了变量,但它也说找到了 适用版本2.1.0,最低要求为1.8.5

以下是我在Mac上构建OSL时遇到的错误:

-- Building OSL 1.11.0
-- CMake version is 3.13.3
CMake Deprecation Warning at CMakeLists.txt:20 (cmake_policy):
  The OLD behavior for policy CMP0046 will be removed from a future version
  of CMake.

  The cmake-policies(7) manual explains that the OLD behaviors of all
  policies are deprecated and that a policy should be set to OLD only under
  specific short-term circumstances.  Projects should be ported to the NEW
  behavior and not rely on setting a policy to OLD.


-- Project build dir   = /Users/simionnacu/Desktop/TestingGrounds/osl/build/macosx
-- Project install dir = /Users/simionnacu/Desktop/TestingGrounds/osl/dist/macosx
-- platform = macosx
-- CMAKE_CXX_COMPILER is /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
-- CMAKE_CXX_COMPILER_ID is AppleClang
-- Building for C++11
-- Setting Namespace to: OSL_v1_11
CMake Error at /usr/local/Cellar/cmake/3.13.3/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Could NOT find OpenImageIO (missing: OPENIMAGEIO_LIBRARY_DIRS) (found
  suitable version "2.1.0", minimum required is "1.8.5")
Call Stack (most recent call first):
  /usr/local/Cellar/cmake/3.13.3/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
  src/cmake/modules/FindOpenImageIO.cmake:79 (find_package_handle_standard_args)
  src/cmake/externalpackages.cmake:58 (find_package)
  CMakeLists.txt:133 (include)
编辑:根据@Tsyvarev answer添加了我的环境变量和文件夹树的图像 错误消息

Could NOT find OpenImageIO (missing: OPENIMAGEIO_LIBRARY_DIRS) (found
  suitable version "2.1.0", minimum required is "1.8.5")
意味着CMake已找到OpenImageIO头,已从中检测到版本2.1.0,但无法找到库

给定的错误消息不会告诉任何关于环境变量设置的信息,OPENIMAGEIO_LIBRARY_DIRS是脚本使用的CMake变量

但是,如果打开CMake调用跟踪中列出的脚本,您可能会找到一种方法来提示它您安装了OpenImageIO:

# Special inputs:
#   OPENIMAGEIO_ROOT_DIR - custom "prefix" location of OIIO installation
#                          (expecting bin, lib, include subdirectories)
也就是说,您可以将OPENIMAGEIO_ROOT_DIR环境变量设置为OPENIMAGEIO库的安装路径。如注释中所述,此安装路径应包含bin/、lib/和include/子目录。在lib/子目录中,它应该是带有适当前缀和后缀的OpenImageIO库文件。

因此,脚本的行为方式不同寻常:

如果它在第一次运行cmake时找不到库,那么无论环境设置是否正确,它都会使所有后续的cmake调用失败

在第一次失败后使其成功的唯一方法是删除build目录中的CMake缓存文件CMakeCache.txt

通常,FindXXX.cmake的编写方式是,如果在第一次运行cmake时未找到库,则可以调整环境设置并重新运行cmake,以便再次尝试搜索库。CMake命令find_library、find_path和类似命令完美地支持这种行为

脚本FindOpenImageIO.cmake使用

对于查找OpenImageIO库,然后将库文件的目录部分提取到另一个变量OpenImageIO_library_DIRS中:


但由于缓存选项,它会缓存此类提取的结果,因此如果第一次未找到库,则变量OPENIMAGEIO_library_DIRS将变为空,并且在缓存时不会再次重写。变量的空值由库未找到的脚本处理。

我在问题中添加了.bash_配置文件的屏幕截图和我编译的oiio的树结构。我做错了什么?嗯,假设在.bash\u配置文件中设置了变量OPENIMAGEIO\u ROOT\u DIR,那么您的设置应该可以正常工作。我不知道如何调试find_library调用,该调用实际搜索库,但在您的情况下失败。您可以检查OPENIMAGEIO_INCLUDE_DIR的值,它存储在构建目录中的CMakeCache.txt文件中。此值是否对应于OPENIMAGEIO_ROOT_DIR变量的值?这是我在CMakeCache.txt中的值:OPENIMAGEIO_INCLUDE_DIR:PATH=/Users/simionnacu/Desktop/TestingGrounds/oiio/dist/macosx/INCLUDE It指向INCLUDE DIR,但与OPENIMAGEIO_ROOT_DIRI位于同一目录中修复了它!谢谢你的帮助。基本上,您提到了cmakcache.txt,在浏览了所有行之后,我意识到这是一个缓存,所以我使用了nuke make nuke,然后编译了库。我相信这是新手犯的错误。请在你的回答中添加关于CMakeCache.txt的内容,并制作nuke,我将接受它作为回答。谢谢!好的,删除CMakeCache.txt是一种通用的尝试,在出现任何问题时,例如重置电脑。每当您遇到CMake问题并想请他人帮助时,请尝试删除CMakeCache.txt并再次运行CMake。尽管如此,我还是添加了另一个答案,描述了缓存和脚本的错误。
find_library(OPENIMAGEIO_LIBRARY ...)
get_filename_component (OPENIMAGEIO_LIBRARY_DIRS "${OPENIMAGEIO_LIBRARY}" DIRECTORY CACHE)