错误:magic.h:没有这样的文件或目录(MacOS X V 10.6.8)

时间:2013-10-10 04:31:04

标签: c++ macos linker cmake

我正在开发一个名为“Duplicate File Finder”的项目,我还想提取有关文件类型的信息,例如png,zip,executable等。我发现libmagic(magic.h)可以是用于查找文件类型。但是我在很长一段时间内遇到的问题是编译模块时无法识别magic.h。我的项目使用'cmake'构建系统。我在CMakeLists.txt中定义了所有参数,当我在我的系统中安装魔法路径和库时,它甚至没有给出错误。 我可以做'man libmagic'并且它可以正常工作。以下是我的cmake文件。以下是我的CMakeLists.txt文件。

cmake_minimum_required(VERSION 2.8)
project( duplicateFinder )

set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF)
set(USE_OPENSSL TRUE)
find_package(Boost 1.53.0 COMPONENTS system filesystem regex thread REQUIRED)
find_package(OpenSSL)
FIND_PATH(SQLITE3_INCLUDE_DIR sqlite3.h)
find_library(SQLITE3_LIBRARY sqlite3)
FIND_PATH(MAGIC_INCLUDE_DIR magic.h)
find_library(MAGIC_LIBRARY magic $ENV{MAGIC_LIB_PATH})

if(NOT MAGIC_INCLUDE_DIR)
  message(SEND_ERROR "Failed to find magic.h")
endif()
if(NOT MAGIC_LIBRARY)
  message(SEND_ERROR "Failed to find the magic library")
endif()

if(NOT SQLITE3_INCLUDE_DIR)
  message(SEND_ERROR "Failed to find sqlite3.h")
endif()
if(NOT SQLITE3_LIBRARY)
  message(SEND_ERROR "Failed to find the sqlite3 library")
endif()

if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    SET(duff_SOURCES src/run_duff.cpp src/sys_scan.cpp src/duff_utils.cpp)
    SET(duff_HEADERS src/run_duff.h src/sys_scan.h src/duff_utils.cpp)
    add_executable(bin/dup_finder ${duff_SOURCES} ${duff_HEADERS})
    add_definitions( -DBOOST_ALL_NO_LIB )
    add_definitions( -DBOOST_ALL_DYN_LINK )
    target_link_libraries(bin/dup_finder ${Boost_LIBRARIES} ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${Boost_REGEX_LIBRARY} ${Boost_THREAD_LIBRARY} ${OPENSSL_LIBRARIES} ${SQLITE3_LIBRARY} ${MAGIC_LIBRARY} )                                           
endif()

我在互联网上进行了深入研究但未能解决问题。我希望问题陈述是可以理解的。在这方面可以有人帮助我。提前谢谢。

1 个答案:

答案 0 :(得分:1)

您需要添加

include_directories(${MAGIC_INCLUDE_DIR})

其他评论:由于提升为REQUIRED,如果找不到CMake,CMake将会失败,因此将所有内容都包含在if(Boost_FOUND)中会有点奇怪。 由于你将if内的非升级库链接起来,所以它更加令人困惑......

此外,您还应将${SQLITE3_INCLUDE_DIR}添加到include_directories,因为在另一台计算机上,它们可能位于尚未包含的位置。