2014-09-15 1 views
1

우분투/x86_64에서 ARM 용 라이브러리 Poco을 성공적으로 크로스 컴파일했습니다. 이제 과 함께 Poco을 사용하는 프로그램을 크로스 컴파일하고 있습니다.크로스 컴파일 할 때 cmake CMAKE_FIND_ROOT_PATH 및 CMAKE_INCLUDE_PATH가 루트 파일 시스템을 무시하는 이유는 무엇입니까?

&을 포함하여 대상 파일 시스템에 포함 된 Poco 헤더를 $(SDK_INSTALL_DIR)/filesystem/usr/local/include에 설치했습니다.

나는 또한 내 호스트 파일 시스템에 Poco 개발 라이브러리를 가지고 있으며, 그 과정에 있습니다. /이 USR/일보다 우선 순위가에 설치 걸립니다 포함 내 프로그램의 CMakeLists.txt, 내가

find_path(POCO_INCLUDE_PATH "Poco/Net/HTTPClientSession.h" "../include") 
MESSAGE(FATAL_ERROR "Poco: " ${POCO_INCLUDE_PATH-NOTFOUND} ":" ${POCO_INCLUDE_PATH}) 

처럼 포코를 찾고 있어요에서

내가 점점 계속

Poco: :/usr/include 

내 호스트의 포코 것 같은데 $ (SDK_INSTALL_DIR)/filesystem이고,/usr/local은 전혀 검색되지 않아야합니다.. 해야

. $(SDK_INSTALL_DIR)/environment-setup \ 
    && mkdir -p $(BANANA_DIR) \ 
    && cd $(BANANA_DIR) \ 
    && CMAKE_INSTALL_PREFIX=$(SDK_INSTALL_DIR)/filesystem/usr/local \ 
     CMAKE_FIND_ROOT_PATH=$(SDK_INSTALL_DIR)/filesystem \ 
     CMAKE_INCLUDE_PATH=$(SDK_INSTALL_DIR)/filesystem:$(SDK_INSTALL_DIR)/filesystem/usr/include:$(SDK_INSTALL_DIR)/filesystem/usr/local/include \ 
     CMAKE_LIBRARY_PATH=$(SDK_INSTALL_DIR)/filesystem/usr/lib:$(SDK_INSTALL_DIR)/filesystem/usr/local/lib \ 
     cmake .. 

모두 CMAKE_FIND_ROOT_PATHCMAKE_INCLUDE_PATH이 우선했다, 그러나 이것은 일어나지 않았다 :

나는 명령을 cmake을 실행하고 있습니다.

편집 : 나는 내 호스트의 cmake을 실행 중입니다. 완벽한 세계에서, 이것은 중요하지 않아야하지만, 그것은 내 문제 중 하나라고 생각합니다. 교차 컴파일 툴체인에는 cmake이 없습니다.

find_path()에 오른쪽 Poco을 포함하려면 어떻게해야합니까? 다른 플랫폼에서 프로그램을 컴파일해야하기 때문에 CMakeLists.txt에 명시 적 경로를 추가하는 것은 좋지 않은 옵션입니다.

+0

왜 Poco를 수동으로 크로스 컴파일하는 특별한 이유가 있습니까? [Buildroot] (http://buildroot.uclibc.org/)와 같은 프로젝트를 보셨습니까? – yegorich

+1

find_path (... NO_DEFAULT_PATH) 사용해보기 http://www.cmake.org/cmake/help/v2.8.12/cmake.html#command:find_path –

+0

거기에 : 우리가 원활하게 의심 스러울 수있는 벤더 특정 코드가 있습니다. buildroot의 컴파일. 그리고 우리는 커널과 모듈을 포함하여 바이너리로 컴파일되고 사전 설치 된 약 백 개의 다른 패키지를 가지고 있습니다. 그래도 조언 주셔서 감사합니다. –

답변

1

한 가지 문제는 복잡한 설정이었습니다. 크로스 컴파일 할 때 호스트의 cmake을 사용하고 있습니다. find_path()

  • CMAKE_PREFIX_PATH, CMAKE_FIND_ROOT_PATH, 심지어 CMAKE_SYSTEM_LIBRARY_PATH 변수

  • 에서

    • NO_something 플래그 일하지 :

      또 다른 부분은 전혀 조합은 아직 불분명 find_path() 행동이다.

      CMAKE_INCLUDE_PATH=$(EXEC_DIR):$(EXEC_DIR)/usr/include:$(EXEC_DIR)/usr/local/include \ 
          CMAKE_LIBRARY_PATH=$(EXEC_DIR):$(EXEC_DIR)/usr/lib:$(EXEC_DIR)/usr/local/lib \ 
          POCO_ROOT=$(POCO_DIR) \ 
          cmake -DPoco_DIR=$(POCO_DIR)/cmake .. \ 
      && make VERBOSE=1 
      

      내 CMakeLists.txt는 이제 다음과 같이 마시고 언급 :

      find_package(Poco REQUIRED) 
      find_library(POCO_FOUNDATION PocoFoundation ${Poco_LIBRARY_DIRS} REQUIRED) 
      find_library(POCO_NET PocoNet ${Poco_LIBRARY_DIRS} REQUIRED) 
      
      include_directories(${Poco_INCLUDE_DIR}) 
      target_link_libraries(detect ${POCO_FOUNDATION} ${POCO_NET}) 
      

      하고있을 수

      나는 빌드 명령으로 자신의 FindPoco.cmake (this one 즉시 근무)를 사용하여 결국 심지어 더 짧아.

    +0

    답변으로 find_path()의 더 나은 설명을 받아 들일 수 있습니다. –