2011-01-11 26 views
3

ローカルにインストールされたライブラリに問題があります。CMake経由で特定/ローカルファイルを見つける方法

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

私はそう見つからない場合はcmakeのは、地元のXMLRPC++ 0.7ディレクトリを使用してフォールバックしたい:私のプロジェクトでは、XMLRPC++ 0.7-ライブラリがあります。最初の2つの問題、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は同じディレクトリにあります –

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) 
関連する問題