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

2024-02-19

我对本地安装的库有疑问。在我的项目中有 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 ---



project(webservice_tesseract)
cmake_minimum_required(VERSION 2.6)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# find tesseract
find_path(TESSERACT_INCLUDE_DIR tesseract/tesseractmain.h
        /opt/local/include
 /usr/local/include
 /usr/include
 )
find_library(TESSERACT_LIBRARY_DIR 
 NAMES tesseract_main
 PATHS 
 /opt/local/lib/
 /usr/local/lib/
 /usr/lib
 )
message(STATUS "looked for tesseract library.")
message(STATUS "Include file detected: [${TESSERACT_INCLUDE_DIR}].")
message(STATUS "Lib file detected: [${TESSERACT_LIBRARY_DIR}].")
add_library(tesseract STATIC IMPORTED)
set_property(TARGET tesseract PROPERTY IMPORTED_LOCATION 
 ${TESSERACT_LIBRARY_DIR}/libtesseractmain.a
 )

#find xmlrpc++
message(STATUS "cmake home dir: [${CMAKE_HOME_DIRECTORY}].")
set(LOCAL_XMLRPCPLUSPLUS ${CMAKE_HOME_DIRECTORY}/xmlrpc0.7++/)
message(STATUS "xmlrpc++ local dir: [${LOCAL_XMLRPCPLUSPLUS}].")
find_path(XMLRPCPLUSPLUS_INCLUDE_DIR XmlRpcServer.h
 ${LOCAL_XMLRPCPLUSPLUS}src
 /opt/local/include
 /usr/local/include
 /usr/include
 )
find_library(XMLRPCPLUSPLUS_LIBRARY_DIR 
 NAMES XmlRpc
 PATHS 
 ${LOCAL_XMLRPCPLUSPLUS}
 /opt/local/lib/
 /usr/local/lib/
 /usr/lib/
 )
# next lines are an ugly workaround because cmake find_xxx() does not find local stuff
if (XMLRPCPLUSPLUS_INCLUDE_DIR)
else (XMLRPCPLUSPLUS_INCLUDE_DIR)
 set(XMLRPCPLUSPLUS_INCLUDE_DIR ${LOCAL_XMLRPCPLUSPLUS}src)
endif (XMLRPCPLUSPLUS_INCLUDE_DIR)
if (XMLRPCPLUSPLUS_LIBRARY_DIR)
else (XMLRPCPLUSPLUS_LIBRARY_DIR)
 set(XMLRPCPLUSPLUS_LIBRARY_DIR ${LOCAL_XMLRPCPLUSPLUS})
endif (XMLRPCPLUSPLUS_LIBRARY_DIR)
message(STATUS "looked for xmlrpc++ library.")
message(STATUS "Include file detected: [${XMLRPCPLUSPLUS_INCLUDE_DIR}].")
message(STATUS "Lib file detected: [${XMLRPCPLUSPLUS_LIBRARY_DIR}].")
add_library(xmlrpc STATIC IMPORTED)
set_property(TARGET xmlrpc PROPERTY IMPORTED_LOCATION 
 ${XMLRPCPLUSPLUS_LIBRARY_DIR}/libXmlRpc.a
 )
#### link together
include_directories(${XMLRPCPLUSPLUS_INCLUDE_DIR} ${TESSERACT_INCLUDE_DIR})
link_directories(${XMLRPCPLUSPLUS_LIBRARY_DIR} ${TESSERACT_LIBRARY_DIR})
add_library(simpleocr STATIC simple_ocr.cpp)
add_executable(webservice_tesseract webservice.cpp)
target_link_libraries(webservice_tesseract xmlrpc tesseract simpleocr)
  

问题已经解决了。这是我的新 CMakeLists.txt:



project(webservice_tesseract)
cmake_minimum_required(VERSION 2.6)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# find 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 "looked for tesseract library.")
message(STATUS "Include file detected: [${TESSERACT_INCLUDE_DIR}].")
message(STATUS "Lib file detected: [${TESSERACT_LIBRARY}].")
add_library(tesseract STATIC IMPORTED)
set_property(TARGET tesseract PROPERTY IMPORTED_LOCATION 
    ${TESSERACT_LIBRARY}
    )
#find xmlrpc++
message(STATUS "cmake home dir: [${CMAKE_HOME_DIRECTORY}].")
set(LOCAL_XMLRPCPLUSPLUS ${CMAKE_HOME_DIRECTORY}/xmlrpc++0.7/)
message(STATUS "xmlrpc++ local dir: [${LOCAL_XMLRPCPLUSPLUS}].")
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 "looked for xmlrpc++ library.")
message(STATUS "Include file detected: [${XMLRPCPLUSPLUS_INCLUDE_DIR}].")
message(STATUS "Lib file detected: [${XMLRPCPLUSPLUS_LIBRARY}].")
add_library(xmlrpc STATIC IMPORTED)
set_property(TARGET xmlrpc PROPERTY IMPORTED_LOCATION 
    ${XMLRPCPLUSPLUS_LIBRARY}
    )
#### link together
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)
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 CMake 查找特定/本地文件 的相关文章

随机推荐

  • Python - 列出函数值的组合对

    我有四个坐标的组合 我试图找到每个坐标之间的距离 我已经能够完成此操作 但是我无法让我的程序列出与每个距离相对应的坐标对 import itertools import math point1 1 1 0 5 point2 3 3 1 po
  • Android 按钮以 Java(而非 XML)编程方式显示状态

    如何为 state pressed 定义 Android 按钮图像 Java 中的 android state focused 例如 如何在 Java 中完成对来自 XML 的等效操作 http developer android com
  • 按最高值对 n 个项目进行多维自定义排序

    我目前可以使用自定义排序方法对多维数组进行排序 每个数组lineupSet has an n物品数量 功能sort points将对每个进行排序lineupSet从最高到最低totalPoints然后它会给我lineupSet总数最高tot
  • 防伪令牌无法解密

    我在 Azure 中部署了一个身份服务器 asp net core 项目 我还有两个使用我的身份服务器作为 SSO 的 asp net 5 mvc 客户端 并且不断出现 保存在日志中 异常 防伪令牌无法解密 今天我们遇到了类似的问题 我们能
  • 如何中止宏

    我有一个宏可以遍历目录并查看其所有文件 不幸的是 该目录位于映射的网络驱动器上 因此该过程非常慢 我怎样才能杀死宏 You can stop a macro by pressing the keys ctrl alt break
  • 播放 UDP 数据包中收到的原始 PCM 音频

    远程设备正在 UDP 数据包中发送实时原始 PCM 音频 不包含标头 我需要在 java 中实现一个程序来接收这些数据包并在 PC 上实时播放它们 据我所知 原始 PCM 的属性是 16 位 单声道 采样率 24KHz 因此我尝试向该原始
  • 创建本地用户帐户

    我有这个代码来创建本地Windows用户 public static bool CreateLocalWindowsAccount string username string password string displayName str
  • 如何修复 Visual Studio 2015 运行项目时出现异常 Microsoft.vshup.server.httphostx64.exe 已停止工作

    我安装了 Visual Studio Community 2015 并创建了一个项目 但是当我运行该项目时 出现以下异常 Microsoft vshup server httphostx64 exe 已停止工作 我使用的是 Windows
  • 如何知道 CompletionService 何时完成交付结果?

    我想使用 CompletionService 来处理一系列线程的结果当它们完成时 我让该服务处于循环状态 以在其提供的 Future 对象可用时获取它们 但我不知道确定所有线程何时完成 从而退出循环 的最佳方法 import java ut
  • 为什么在C中使用malloc时要指定大小?

    采取以下代码 int p malloc 2 sizeof p p 0 10 Using the two spaces I p 1 20 allocated with malloc before p 2 30 Using another sp
  • 对已知已完成的任务调用 .Result 或await 之间有区别吗? [复制]

    这个问题在这里已经有答案了 以下代码块中是否存在任何功能 性能或死锁风险差异 示例1 await Task WhenAll task1 task2 var result1 await task1 var result2 await task
  • 使用 React Navigation 导航堆栈时重新渲染组件

    我目前正在使用react navigation进行堆栈和选项卡导航 每次用户导航到特定屏幕时是否可以重新渲染组件 我想确保重新运行componentDidMount 每次到达特定屏幕时 我都会通过调用适当的操作创建者从服务器获取最新数据 我
  • 合并排序交换和比较

    我目前正在开展一个分析项目 观察不同算法在 Java 中实现时的行为方式 我从网上获得了一些实现合并排序算法的代码 现在我需要在 10 000 个随机生成的整数 1 到 100 000 之间 的数组上运行此代码 并记录进行了多少次交换和比较
  • WCF 服务应用程序使用 WebGet 返回 404

    我仅创建了最基本的 WCF 服务应用程序来进行一些原型设计 但我无法使 WebGet 实现正常工作 这是我的界面 ServiceContract public interface IService OperationContract Web
  • 尝试连接 amazon mysql rds 时出现错误 10060

    我创建了一个MYSQL Amazon RDS实例并尝试通过以下方式访问它MYSQL Workbench从 Windows 机器 但我得到了10060错误而Amazon RDS是可公开访问的 我在亚马逊论坛上阅读了一些文档 但我无法理解如何设
  • 获取分支的特定版本

    有没有办法下载分支的特定版本 我特别想做一个 git 克隆https github com Theano Theano https github com Theano Theano现在 并保存一组有关如何从 github 获取完全相同版本的
  • Cassandra如何在表中添加集群键?

    cassandra中有一张表 create table test moments id Text title Text sort int PRIMARY KEY id 如何在 排序 列中添加聚类键 不重新创建表 主要问题是磁盘上的数据结构
  • 如何在 AngularJS 中检测 onKeyUp?

    如何在 AngularJS 中检测 onKeyUp 我正在寻找一个 ngOnkeyup 指令 类似于 ngChange 但我找不到任何合适的东西 如果没有这样的指令 是否有一种干净的方法可以从浏览器本机 onkeyup 事件调用控制器 对于
  • Pandas Dataframe 一次迭代两行

    我正在使用以下Dataframe Price Price2 Count perc change 0 0 000868 33782 17 4 1 000000 1 0 000872 33224 89 3 0 460829 2 0 000875
  • 如何通过 CMake 查找特定/本地文件

    我对本地安装的库有疑问 在我的项目中有 xmlrpc 0 7 library myproject xmlrpc 0 7 src 如果没有找到 我希望 CMake 使用本地 xmlrpc 0 7 目录进行回退 有两个问题 第一个问题 find