2011-01-11 1 views
3

У меня проблема с локально установленной библиотекой. В моем проекте есть XMLRPC++ 0,7-библиотека:Как найти конкретные/локальные файлы через CMake

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

Я хочу CMake для Отката с использованием локального XMLRPC++ 0.7 каталога, если не нашел в противном случае. Две проблемы, первая, find_path() или find_library() не работают с локальным dir. Я использовал обходное тестирование, если переменные, обработанные 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. Это объясняет ошибку компиляции. Но проблема с локальным путем все еще существует. Если я прокомментировал обходной путь, пути будут пустыми. КСТАТИ. xmlrpc.h и xmlrpcserver.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) 
Смежные вопросы