gpt4 book ai didi

c - OSX + homebrew + CMake + libpng 版本不匹配问题

转载 作者:行者123 更新时间:2023-12-03 14:28:05 25 4
gpt4 key购买 nike

我在使用 CMake 在 OSX 上构建 C++ 项目时遇到了一个相当奇怪的问题,同时将 libpng 作为依赖项引入。我通过 Homebrew 软件和以下 CMake 规则安装了 libpng 1.6.21:

FIND_PACKAGE(PNG REQUIRED)
INCLUDE_DIRECTORIES(${PNG_INCLUDE_DIRS})
LINK_DIRECTORIES(${PNG_LIBRARY_DIRS})
ADD_DEFINITIONS(${PNG_DEFINITIONS})

当 CMake 开始构建并找到依赖项时,它会输出:
-- Found PNG: /usr/local/lib/libpng.dylib (found version "1.4.12") 

进一步调查, /usr/local/lib/libpng.dylib是 brew 的 1.6 版本的符号链接(symbolic link):
$ ls -l /usr/local/lib/libpng.dylib 
lrwxr-xr-x 1 fluffy admin 40 Apr 9 16:06 /usr/local/lib/libpng.dylib -> ../Cellar/libpng/1.6.21/lib/libpng.dylib

但是,它似乎是不正确的 png.h包括在内,打印出 PNG_LIBPNG_VER_STRING启动时输出 1.4.12 .当然,当我尝试运行我的程序时,我得到一个版本不匹配并且库无法工作:
libpng warning: Application built with libpng-1.4.12 but running with 1.6.21
libc++abi.dylib: terminating with uncaught exception of type std::runtime_error: [write_png_file] png_create_write_struct failed

使用 FIND_PACKAGE(PNG) , -I当我使用 VERBOSE=1 构建时,声明永远不会出现在我的构建行中.但是,如果我使用 PkgConfig 方法:
FIND_PACKAGE(PkgConfig)
PKG_CHECK_MODULES(LIBPNG libpng16 REQUIRED)
INCLUDE_DIRECTORIES(${LIBPNG_INCLUDE_DIRS})
LINK_DIRECTORIES(${LIBPNG_LIBRARY_DIRS})
LINK_LIBRARIES(${LIBPNG_LIBRARIES})
ADD_DEFINITIONS(${LIBPNG_DEFINITIONS})

正确的 -I标志确实出现了,但它仍在使用系统 png.h而不是 Homebrew 的。

有什么办法可以强制编译器使用 Homebrew 的 png.h ?我不能简单地卸载 Homebrew 软件 libpng,因为我的一些其他软件包依赖于它,包括该程序使用的其他库。

编辑:作为临时解决方法,我刚刚添加了 /usr/local/include给我的 INCLUDE_DIRS()包括 libpng16/png.h相反,但这是一个脆弱的黑客。

最佳答案

今天偶然发现了这个令人发指的错误,并花了一些时间来解决它。
问题是经典的 cmake 风格 Find*.cmake 分别搜索头文件和库 - 在某些情况下,结果可能和将不匹配。
MacOS 通过具有特殊情况的框架夸大了这个问题,默认情况下在其他位置之前被搜索。
在我的情况下,cmake 从/Library/Frameworks/Mono.framework 中找到 header ,这些 header 当然已经过时并且根本没有库。
您有以下选择:

  • 设置(CMAKE_FIND_FRAMEWORK LAST)
    这解决了像这样的流氓框架的问题(在我的情况下)
    这是快速脏修复。
  • 像原来一样使用 PackageConfig - 这是推荐的长期解决方案。
    使用 PackageConfig 可以防止 lib/headers/flags 不匹配。
    您唯一应该做的就是确保在系统路径之前将包含路径传递给编译器。
  • 删除有问题的框架/路径/库(例如 zlib 有时也会打包 libpng!)
  • 在您的存储库中包含 libpng 的副本并使用它
  • 关于c - OSX + homebrew + CMake + libpng 版本不匹配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36523911/

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