我在使用CMake在OSX上构建一个C++项目时遇到了一个比较奇怪的问题,这个项目需要依赖libpng。我已经通过homebrew安装了libpng 1.6.21,并使用以下CMake规则:
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
。当我尝试运行程序时,出现版本不匹配的问题,这导致库无法工作。请注意保留HTML标记。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的。有没有办法强制编译器使用Homebrew的png.h
?我不能简单地卸载Homebrew的libpng,因为我的其他一些包依赖它,包括这个程序使用的其他库。编辑:作为一个临时解决方法,我只是将
/usr/local/include
添加到我的INCLUDE_DIRS()
中,并包含了libpng16/png.h
,但这是一个脆弱的hack。