如何通过CMake查找特定/本地文件

3

我有一个关于本地安装库的问题。在我的项目中使用了 xmlrpc++0.7-library 库:

myproject/
 +-- xmlrpc++0.7/
      +-- src/

我希望CMake在找不到其他路径时能够使用本地xmlrpc++0.7目录。有两个问题,第一个是find_path()或find_library()不能与本地目录一起使用。我使用了一个变量处理的解决方法来测试find_xxx()是否为空。如果为空,我手动设置它们。现在CMake可以生成Makefile而不出错。但是,如果我想通过make编译项目,c ++编译器会返回“错误:XmlRpc.h:未找到文件”。文件XmlRpc.h位于myproject / xmlrpc++0.7 / src中,如果我手动编译所有内容,就可以正常工作。

这是我的CMakeLists.txt。如果有人能指导我正确的解决方案,让CMake在上述条件下运行,我会非常感谢。

--- CMakeLists.txt ---

项目名称(webservice_tesseract)
需要最低版本的CMAKE为2.6
设置当前目录包含在包含文件路径中
# 寻找tesseract 寻找路径为TESSERACT_INCLUDE_DIR/tesseract/tesseractmain.h的头文件 /opt/local/include /usr/local/include /usr/include 寻找名为'tesseract_main'的库文件 /opt/local/lib/ /usr/local/lib/ /usr/lib 提示信息:“已查找到tesseract库。” 提示信息:“已检测到头文件:[${TESSERACT_INCLUDE_DIR}]。” 提示信息:“已检测到库文件:[${TESSERACT_LIBRARY_DIR}]。” 添加导入静态库tesseract 将目标属性设置为tesseract的导入位置: ${TESSERACT_LIBRARY_DIR}/libtesseractmain.a
# 寻找xmlrpc++ 提示信息:“cmake主目录:[${CMAKE_HOME_DIRECTORY}]。 ” 设置LOCAL_XMLRPCPLUSPLUS为${CMAKE_HOME_DIRECTORY}/xmlrpc0.7++/ 提示信息:“xmlrpc++本地目录:[${LOCAL_XMLRPCPLUSPLUS}]。” 寻找路径为XmlRpcServer.h的头文件 ${LOCAL_XMLRPCPLUSPLUS}src /opt/local/include /usr/local/include /usr/include 寻找名为'XmlRpc'的库文件 ${LOCAL_XMLRPCPLUSPLUS} /opt/local/lib/ /usr/local/lib/ /usr/lib/ 如果(XMLRPCPLUSPLUS_INCLUDE_DIR)不为空,则跳过此if语句,否则将XMLRPCPLUSPLUS_INCLUDE_DIR设置为${LOCAL_XMLRPCPLUSPLUS}src 如果(XMLRPCPLUSPLUS_LIBRARY_DIR)不为空,则跳过此if语句,否则将XMLRPCPLUSPLUS_LIBRARY_DIR设置为${LOCAL_XMLRPCPLUSPLUS} 提示信息:“已查找到xmlrpc++库。” 提示信息:“已检测到头文件:[${XMLRPCPLUSPLUS_INCLUDE_DIR}]。” 提示信息:“已检测到库文件:[${XMLRPCPLUSPLUS_LIBRARY_DIR}]。” 添加导入静态库xmlrpc 将目标属性设置为xmlrpc的导入位置: ${XMLRPCPLUSPLUS_LIBRARY_DIR}/libXmlRpc.a
# 链接在一起 包含目录: ${XMLRPCPLUSPLUS_INCLUDE_DIR} ${TESSERACT_INCLUDE_DIR} 链接库搜索路径: ${XMLRPCPLUSPLUS_LIBRARY_DIR} ${TESSERACT_LIBRARY_DIR} 添加静态库simpleocr 包含simple_ocr.cpp 添加可执行文件webservice_tesseract 包含webservice.cpp 目标链接到以下库: xmlrpc tesseract simpleocr
2个回答

5
问题已经解决。这是我的新的CMakeLists.txt文件:
project(webservice_tesseract)
cmake_minimum_required(VERSION 2.6)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# 查找tesseract find_path(TESSERACT_INCLUDE_DIR tesseract/tesseractmain.h /opt/local/include /usr/local/include /usr/include ) find_library(TESSERACT_LIBRARY NAMES tesseract_main PATHS /opt/local/lib/ /usr/local/lib/ /usr/lib )
message(STATUS "查找tesseract库") message(STATUS "找到头文件: [${TESSERACT_INCLUDE_DIR}].") message(STATUS "找到库文件: [${TESSERACT_LIBRARY}].")
add_library(tesseract STATIC IMPORTED) set_property(TARGET tesseract PROPERTY IMPORTED_LOCATION ${TESSERACT_LIBRARY} )
# 查找xmlrpc++ set(LOCAL_XMLRPCPLUSPLUS ${CMAKE_HOME_DIRECTORY}/xmlrpc++0.7/) find_path(XMLRPCPLUSPLUS_INCLUDE_DIR XmlRpc.h ${LOCAL_XMLRPCPLUSPLUS}src /opt/local/include /usr/local/include /usr/include ) find_library(XMLRPCPLUSPLUS_LIBRARY NAMES XmlRpc PATHS ${LOCAL_XMLRPCPLUSPLUS} /opt/local/lib/ /usr/local/lib/ /usr/lib/ )
message(STATUS "查找xmlrpc++库") message(STATUS "找到头文件: [${XMLRPCPLUSPLUS_INCLUDE_DIR}].") message(STATUS "找到库文件: [${XMLRPCPLUSPLUS_LIBRARY}].")
add_library(xmlrpc STATIC IMPORTED) set_property(TARGET xmlrpc PROPERTY IMPORTED_LOCATION ${XMLRPCPLUSPLUS_LIBRARY} )
# 链接库 include_directories(${XMLRPCPLUSPLUS_INCLUDE_DIR} ${TESSERACT_INCLUDE_DIR}) link_directories(${XMLRPCPLUSPLUS_LIBRARY} ${TESSERACT_LIBRARY})
add_library(simpleocr STATIC simple_ocr.cpp) add_executable(webservice_tesseract webservice.cpp) target_link_libraries(webservice_tesseract xmlrpc tesseract simpleocr)

1

find_library 不关心你所谓的本地/全局路径。它会在你指定的路径中搜索。请确认你要搜索的路径是否正确。在你的问题中,你提到了 xmlrpc++0.7,但在你的 cmakelists.txt 中却寻找 xmlrpc0.7++,这可能是未找到的原因。另外,正如你所说,编译器在找不到 xmlrpc.h 时失败,但你使用 xmlrpcserver.h 来查找路径。


谢谢。这解释了编译错误的问题。但是本地路径的问题仍然存在。如果我注释掉这个解决方法,路径将会被设置为空。顺便说一下,<code>xmlrpc.h</code>和<code>xmlrpcserver.h</code>在同一个目录中。 - Andreas Romeyke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接