flu*_*ffy 6 c macos homebrew cmake libpng
我在使用 CMake 在 OSX 上构建 C++ 项目时遇到了一个相当奇怪的问题,同时将 libpng 作为依赖项引入。我通过自制软件安装了 libpng 1.6.21 和以下 CMake 规则:
FIND_PACKAGE(PNG REQUIRED)
INCLUDE_DIRECTORIES(${PNG_INCLUDE_DIRS})
LINK_DIRECTORIES(${PNG_LIBRARY_DIRS})
ADD_DEFINITIONS(${PNG_DEFINITIONS})
Run Code Online (Sandbox Code Playgroud)
当 CMake 开始构建并找到依赖项时,它输出:
-- Found PNG: /usr/local/lib/libpng.dylib (found version "1.4.12")
Run Code Online (Sandbox Code Playgroud)
进一步调查,/usr/local/lib/libpng.dylib是 brew 1.6 版本的符号链接:
$ 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
Run Code Online (Sandbox Code Playgroud)
但是,似乎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
Run Code Online (Sandbox Code Playgroud)
使用 时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})
Run Code Online (Sandbox Code Playgroud)
-I确实出现了正确的标志,但它仍在使用系统png.h而不是 Homebrew 的。
有没有办法强制编译器使用自制软件png.h?我不能简单地卸载自制软件 libpng,因为我的其他一些软件包依赖于它,包括该程序使用的其他库。
编辑:作为临时解决方法,我刚刚添加/usr/local/include到我的INCLUDE_DIRS()并包含在内libpng16/png.h,但这是一个脆弱的黑客。
小智 6
今天偶然发现了这个令人恼火的错误,并花了一些时间来解决它。问题是经典的 cmake 风格的 Find*.cmake 分别搜索标头和库 - 在某些情况下结果可能会不匹配。MacOS 通过框架的特殊情况夸大了这个问题,默认情况下会在其他位置之前进行搜索。
就我而言,cmake 从 /Library/Frameworks/Mono.framework 找到标头,这些标头当然已经过时并且根本没有库。
您有以下选择:
set(CMAKE_FIND_FRAMEWORK LAST) 这修复了像这样的流氓框架的问题(在我的例子中)这是快速的脏修复。
像最初一样使用 PackageConfig - 这是推荐的长期解决方案。使用 PackageConfig 可以防止 lib/headers/flags 不匹配。您唯一应该做的就是确保包含路径在系统路径之前传递给编译器。
删除有问题的框架/路径/库(例如,zlib 有时也会打包 libpng!)
在您的存储库中包含 libpng 的副本并使用它
| 归档时间: |
|
| 查看次数: |
1558 次 |
| 最近记录: |