【发布时间】:2016-07-31 03:39:14
【问题描述】:
我在使用 CMake 在 OSX 上构建 C++ 项目时遇到了一个相当奇怪的问题,同时将 libpng 作为依赖项引入。我通过自制软件和以下 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 版本的符号链接:
$ 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),当我使用VERBOSE=1 构建时,-I 声明永远不会出现在我的构建行中。但是,如果我使用 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。
有没有办法强制编译器使用自制的png.h?我不能简单地卸载 homebrew libpng,因为我的一些其他软件包依赖于它,包括该程序使用的其他库。
编辑:作为临时解决方法,我刚刚将/usr/local/include 添加到我的INCLUDE_DIRS() 并包含libpng16/png.h,但这是一个脆弱的hack。
【问题讨论】:
-
@joel 这不是重复的,这是 OSX 特有的问题;这个问题的答案是什么对我不起作用。
-
您的问题与平台无关
-
@Joel 但事实并非如此。 OSX 提供了系统 libpng,homebrew 提供了不同的版本。并查看链接的答案并将其与我在这里使用的 CMake 片段进行比较...
-
@S.S.Anne 不幸的是,不,自从我发布这个问题以来的四年里,我没有做任何 C++ 和 libpng 的东西。听到这个问题仍然存在,有点令人沮丧。
标签: c macos cmake homebrew libpng