2014-06-18 4 views
1

나는 stackoverflow 및 다른 포럼에서 검색했지만 아무 소용이없는 cmake-baed 부스트 링크 문제로 고민하고 있습니다.cmake를 사용하여 부스터 라이브러리를 연결하는 경우 2.8.8

Boost가 이미 설치된 클러스터에서 C++ 프로그램 모음 (Boost 외에도 다른 라이브러리에 따라 다름)을 컴파일 중입니다. 전체 경로를 알고 있습니다. 컴파일하는 동안 cmake로 부스트하는 이상한 링크 에러를 얻은 후, 나는 문제를 해결하기 위해 아주 간단한 boost-cmake 예제를 먼저 컴파일하는 것을 고려했다.

코드는 아래와 같습니다.

#include <boost/program_options/options_description.hpp> 
#include <boost/program_options/option.hpp> 
using namespace std; 
#include <iostream> 

namespace po = boost::program_options; 

int main(int argc, char** argv) { 

po::options_description desc("Allowed options"); 
desc.add_options() 
    ("help", "produce help message") 
    ; 

return 0; 
} 

다음 CMakeLists.txt 파일을 사용하여 제작하고 있습니다. 내가 cmake를 사용하여 컴파일 할 때

cmake_minimum_required(VERSION 2.8) 
set(Boost_INCLUDE_DIR /software/apps/boost/1.55.0/build06/include) 
set(Boost_LIBRARY_DIR /software/apps/boost/1.55.0/build06/lib) 

find_package(Boost COMPONENTS program_options REQUIRED) 
include_directories(${Boost_INCLUDE_DIR}) 
link_directories(${Boost_LIBRARY_DIR}) 

message("Boost include dir is ${Boost_INCLUDE_DIR}") 
message("Boost library dir is ${Boost_LIBRARY_DIR}") 
message("Boost libraries are at ${Boost_LIBRARIES}") 

add_executable(main main.cpp) 
target_link_libraries(main ${Boost_LIBRARIES}) 

, 나는 문제가 아래로 내가 코드를 "할"때 오는 다음과 같은 출력

[email protected] build]$ emacs ../CMakeLists.txt 
Display localhost:39.0 unavailable, simulating -nw 
[[email protected] build]$ rm -rf * 
[[email protected] build]$ cmake .. 
-- The C compiler identification is GNU 4.7.2 
-- The CXX compiler identification is GNU 4.7.2 
-- Check for working C compiler: /software/apps/comp_wrapper/gnu/gcc 
-- Check for working C compiler: /software/apps/comp_wrapper/gnu/gcc -- works 
-- Detecting C compiler ABI info 
-- Detecting C compiler ABI info - done 
-- Check for working CXX compiler: /software/apps/comp_wrapper/gnu/c++ 
-- Check for working CXX compiler: /software/apps/comp_wrapper/gnu/c++ -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 
Boost found. 
Found Boost components: 
program_options 
Boost include dir is /usr/include 
Boost library dir is /software/apps/boost/1.55.0/build06/lib 
Boost libraries are at optimized;boost_program_options-mt-shared;debug;boost_program_options-mt-shared-debug 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /home/x_ikrul/Downloads/boost_example/build 

를 얻을. 당신이 볼 수있는 바와 같이 CMake가 이상하게 시간을 연결에서 /software/apps/boost/1.55.0/build06/lib 수 부스트의 lib 디렉토리를 보여주고 있지만

[email protected] build]$make 
Scanning dependencies of target main 
[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o 
make[2]: *** No rule to make target `/usr/lib64/lib64/libboost_program_options-mt.so.5', needed by `main'. Stop. 
make[1]: *** [CMakeFiles/main.dir/all] Error 2 
make: *** [all] Error 2 

, 그것은 다른 비 참조한다 exiting 디렉토리.

아무도 이런 오류가 발생 했습니까? 클러스터는 CentOS 릴리스 6.5, 부스트 (내가 가리키는 곳)가 1.55.0이고 사용중인 cmake가 2.8.8입니다.

+0

귀하의 부스트 포함 dir도 정확하게 발견되지 않았습니까? 'Boost include dir is/usr/include' – fileoffset

+0

맞습니다. 실제로이 예제를 cmake/boost의 같은 버전으로 다른 클러스터에서 시도했을 때 모든 것이 원활하게 진행되지만 현재 컴퓨터에서는 이상한 오류가 발생합니다. – Ikram

답변

1

stackoverflow answer은 cmake 명령 줄에 -DBoost_NO_BOOST_CMAKE=ON을 추가 할 것을 제안합니다.

일부 CMake 버전이 일부 부스트 버전에서 제대로 작동하지 않기 때문에 발생하는 것으로 보입니다.

그리고 나는 프레이저가 말한 것에 동의합니다. 이 라인들은 Boake 검색의 결과를 저장하기 위해 CMake가 사용하는 변수들이므로

set(Boost_INCLUDE_DIR /software/apps/boost/1.55.0/build06/include) 
set(Boost_LIBRARY_DIR /software/apps/boost/1.55.0/build06/lib) 

과 같은 변수들이 해당 값으로 사용되기 때문에 의미가 없습니다. 그의 대답에서 그것에 대해 자세히 읽어보십시오.

+0

맞습니다. 이제 세트 (.) CMakeLists.txt에서 선을 더 투명하게 만듭니다. 감사 – Ikram

3

힌트 경로를 올바르게 설정하지 않았습니다. FindBoost module docs 가입일

:

이 모듈은 변수의 검색 위치에 관한 힌트를 읽

BOOST_ROOT은 - 기본 설치 프리픽스 (또는 BOOSTROOT)

BOOST_INCLUDEDIR - 바람직한 예 디렉토리를 포함 <prefix>/include

BOOST_LIBRARYDIR - 선호 라이브러리 디렉토리 <prefix>/lib

Boost_NO_SYSTEM_PATHS - ON으로 설정하면이 힌트 변수에 지정된 이 아닌 위치에서 검색을 사용하지 않도록 설정됩니다. 기본값은 OFF입니다.

...

및 CMake 캐시 항목에 지속적으로 검색 결과를 저장합니다

Boost_INCLUDE_DIR - 디렉토리 포함 부스트 헤더

Boost_LIBRARY_DIR - 디렉토리 포함 부스트 라이브러리

그래서, 당신의 라인 :

set(Boost_INCLUDE_DIR /software/apps/boost/1.55.0/build06/include) 
set(Boost_LIBRARY_DIR /software/apps/boost/1.55.0/build06/lib) 

은 실제로 se가 아닙니다. tint 힌트 변수 - BOOST_INCLUDEDIRBOOST_LIBRARYDIR을 설정하려고합니다. 가능하면 Boost_NO_SYSTEM_PATHS.

CMakeLists.txt는 휴대용이 아니기 때문에 하드 코딩하지 않는 것이 가장 좋습니다. CMake를 호출 할 때 오히려 명령 행에서 다음을 통과 : 당신이 ONBoost_DEBUG를 설정하면

cmake . -DBOOST_INCLUDEDIR=/software/apps/boost/1.55.0/build06/include -DBOOST_LIBRARYDIR=/software/apps/boost/1.55.0/build06/lib -DBoost_NO_SYSTEM_PATHS=ON 

당신은 또한 무슨 일이 일어나고 있는지의 더 나은 아이디어를 얻을 수 있습니다.

부스트 라이브러리에 대한 전체 경로가 target_link_libraries 호출로 전달되므로 제쳐두고 link_directories 호출이 필요하지 않습니다.

+0

이 시도한 및 BOOST_INCLUDEDIR 및 BOOST_LIBRARYDIR 인쇄 할 때이 경로를 출력하지 않습니다. 나는 BOOST_LIBRARY_DIR/BOOST_LIBRARY_DIRS와 BOOST_INCLUDE_DIR/BOOST_INCLUDE_DIRS를 사용해 보았지만 만들 수 없었다. 다른 클러스터에서 코드/스크립트를 시도하고 거기에서 행복하게 컴파일했습니다. 다른로드 된 라이브러리와 충돌이있을 것이라고 생각하십니까? 도움에 감사드립니다 :-) – Ikram

+0

컨트롤이 FindCMake 모듈에 도착하기 전에이 값 *이 설정되거나 덮어 쓰기 될 수 있습니다. CMakeLists.txt에서 출력하는 곳과'cmake '로 출력하는 부분을 설정하는 방법으로 질문을 업데이트 할 수 있습니까? -DBoost_DEBUG = ON'입니까? – Fraser

+0

마지막으로 BOOST_ROOT, BOOST_INCLUDEDIR 및 BOOST_LIBRARYDIR을 사용하여 원하는 경로를 연결할 수있었습니다. 나는 처음에 BOOST_INCLUDEDIR 또는 BOOST_INCLUDE_DIRS (입력 및 출력 변수)를 사용할지 혼란스러워했습니다. 이 대답은 분명했습니다. 고마워요 많은 사람 ... – Ikram

관련 문제