2011-01-11 24 views
3

我在本地安装的库存在问题。在我的项目存在XMLRPC++的0.7库:如何通过CMake找到特定/本地文件

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

我想CMake的使用本地XMLRPC,如果没有找到,否则回退到++目录0.7。两个问题,第一个,find_path()或find_library()不适用于本地目录。如果find_xxx()处理的变量是空的,我使用变通方法测试。如果为空,我手动设置它们。 cmake现在生成没有错误的Makefile。但是如果我想通过make编译项目,C++编译器将返回“error:XmlRpc.h:file not found”。文件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) 

回答

1

find_library不关心局部/全局路径,你给他们打电话。它将搜索您指定的路径以查找。验证您正在搜索的路径是否正确。在你的问题你提到XMLRPC++ 0.7但是在你的CMakeLists.txt你看xmlrpc0.7 ++这可以解释为什么它没有找到。另外,如您所说,编译器无法找到xmlrpc.h,但您使用xmlrpcserver.h来查找路径。

+0

Thx。这解释了编译错误。但本地路径的问题仍然存在。如果我注释了解决方法,路径将被设置为空。 BTW。 xmlrpc.hxmlrpcserver.h位于相同的目录中 – 2011-01-11 15:28:44

5

问题解决了。这里是我的新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) 
相关问题