2015-02-27 40 views
34

tôi có các thiết lập sau đây cho ++ phát triển C:Làm thế nào để đưa thư viện bên ngoài (boost) vào dự án CLion C++ với CMake?

  • OS X Yosemite
  • CLion 140.2310.6 (chéo plattform C/C++ - IDE bởi JetBrains sử dụng CMake như xây dựng hệ thống)
  • cài đặt boost qua brew install boost vào /usr/local/Cellar/boost/

Bây giờ, mục tiêu của tôi là thiết lập một dự án đơn giản và bao gồm thư viện boost. Tôi định nghĩa chỉ là một test.cpp tập tin đó trông như thế này:

#include <iostream> 
#include <boost> 

using namespace std; 

int test() { 
    cout << "Hello, World!" << endl; 
    return 0; 
} 

CMakeLists.txt tập tin của tôi trông như thế này:

cmake_minimum_required(VERSION 2.8.4) 
project(MyProject) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

include_directories("/usr/local/Cellar/boost/1.57.0/include/boost") 

set(SOURCE_FILES main.cpp ./test.cpp) 
add_executable(MyProject ${SOURCE_FILES}) 

Khi tôi xây dựng dự án, tôi nhận được sau lỗi:

/Users/nburk/Documents/uni/master/master_thesis/MyProject/test.cpp:2:10: fatal error: 'boost' file not found

make[3]: *** [CMakeFiles/MyProject.dir/test.cpp.o] Error 1 make[2]: *** [CMakeFiles/MyProject.dir/all] Error 2 make[1]: *** [CMakeFiles/MyProject.dir/rule] Error 2 make: *** [MyProject] Error 2

Tôi đã chơi xung quanh với điều chỉnh đường dẫn ở đây và ở đó và cũng sử dụng add_librarytarget_link_libraries, không ai trong số đó làm cho dự án xây dựng thành công.

Ai đó có thể chỉ đúng hướng để đảm bảo rằng tôi có thể đưa chức năng boost vào dự án CLION C++ của tôi không?

Cập nhật: Nhờ @ câu trả lời Waxo của tôi đã sử dụng đoạn mã sau vào CMakeLists.txt tập tin của tôi đó:

set(Boost_INCLUDE_DIR /usr/local/Cellar/boost/1.57.0) 
set(Boost_LIBRARY_DIR /usr/local/Cellar/boost/1.57.0/lib) 
find_package(Boost COMPONENTS system filesystem REQUIRED) 
include_directories(${Boost_INCLUDE_DIR}) 

bây giờ tôi lừa bóng qua các tập tin không tìm thấy-lỗi, nhưng thay vào đó tôi nhận được thông tin sau:

CMake Error at /Applications/CLion EAP.app/Contents/bin/cmake/share/cmake-3.1/Modules/FindBoost.cmake:685 (file):

file STRINGS file "/usr/local/Cellar/boost/1.57.0/boost/version.hpp" cannot be read.

Call Stack (most recent call first): CMakeLists.txt:11 (find_package)

Bất kỳ ý tưởng nào tôi vẫn còn thiếu? Điểm mấu gọi (685) trong FindBoost.cmake là: file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ")

+2

Đừng đặt những 'biến Boost' bằng tay. 'find_package' sẽ hoạt động ra khỏi hộp. Nếu không, bạn nên chuyển 'Boost_DIR' thành' cmake'command. Không viết đường dẫn hệ thống cụ thể trong CMakeLists.txt. Toàn bộ điểm của cmake là nền tảng chéo. Cấu hình nền tảng cụ thể nên hiếm khi được yêu cầu, và nếu đó là cách để làm điều đó là để vượt qua các thông số cấu hình thông qua dòng lệnh hoặc thông qua cmake-gui. – sbabbi

+0

nếu tôi không bao gồm nó, tôi nhận được trở lại ** tập tin không tìm thấy ** - lỗi ... tuy nhiên, tôi chắc chắn rằng tôi thiếu cái gì khác và tư vấn của bạn có vẻ hợp lý với tôi! vấn đề chính của tôi là tôi không hiểu một số vấn đề cơ bản về cách CMake thực sự hoạt động, vì vậy tôi đoán mình phải ngồi xuống và làm bài tập ở nhà vì tôi không thể tìm ra một giải pháp tầm thường ... – nburk

+0

Tôi nhận thấy bây giờ cài đặt tăng cường của bạn nằm trong đường dẫn không chuẩn ('/ usr/local/cellar'). [Cách thích hợp] (http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html) để thông báo cho cmake tìm kiếm tăng trong thư mục đó là gọi cmake với 'cmake -DBOOST_ROOT = /usr/local/Cellar/boost/1.57.0 ... ' – sbabbi

Trả lời

50

Sau khi dành cả buổi chiều về vấn đề này, tôi giải quyết nó bản thân mình. Đó là một sai lầm khá ngu ngốc và tất cả các gợi ý trong câu trả lời của @ Waxo thực sự hữu ích.

Lý do tại sao nó không hoạt động đối với tôi mà tôi đã viết #include <boost> trong số test.cpp -file của mình, điều này rõ ràng là sai. Thay vào đó, bạn cần tham khảo trực tiếp các tệp tiêu đề mà bạn thực sự muốn bao gồm, vì vậy bạn nên viết e.g. #include <boost/thread.hpp>.

Sau khi tất cả, một chuỗi ngắn của báo cáo là đủ để thành công (và nền tảng độc lập) bao gồm boost vào một dự án CMake:

find_package(Boost 1.57.0 COMPONENTS system filesystem REQUIRED) 
include_directories(${Boost_INCLUDE_DIRS}) 
add_executable(BoostTest main.cpp) 
target_link_libraries(BoostTest ${Boost_LIBRARIES}) 

Những dòng này đang làm sự kỳ diệu ở đây. Để tham khảo, đây là một hoàn CMakeLists.txt tập tin mà tôi sử dụng để gỡ lỗi trong một dự án dòng lệnh riêng biệt:

cmake_minimum_required(VERSION 2.8.4) 

project(BoostTest) 

message(STATUS "start running cmake...") 

find_package(Boost 1.57.0 COMPONENTS system filesystem REQUIRED) 

if(Boost_FOUND) 

    message(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}") 
    message(STATUS "Boost_LIBRARIES: ${Boost_LIBRARIES}") 
    message(STATUS "Boost_VERSION: ${Boost_VERSION}") 

    include_directories(${Boost_INCLUDE_DIRS}) 

endif() 

add_executable(BoostTest main.cpp) 

if(Boost_FOUND) 

    target_link_libraries(BoostTest ${Boost_LIBRARIES}) 

endif() 
+7

Câu trả lời tuyệt vời, cảm ơn! Đối với người dùng OS X: điều này cũng sẽ hoạt động khi bạn đã cài đặt Boost bằng Homebrew. – Craimasjien

+1

tuyệt vời - đang hoạt động, cảm ơn bạn. – Dada

+0

Tôi đã cài đặt 'boost' với MacPorts và có vẻ như CLion (' phiên bản 1.2.4') đã tự động tìm thấy nó (không có bất kỳ thay đổi nào trong 'CMakeLists.txt'). – irudyak

15

Hãy thử sử dụng CMake find_package (Boost)

src: http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html

Nó hoạt động tốt hơn và CMake được thực hiện cho biên soạn chéo và đưa ra một con đường tuyệt đối không tốt trong một dự án CMake.

Edit:

Nhìn vào cái này quá: How to link C++ program with Boost using CMake

Bởi vì bạn không liên kết thực sự là thư viện động lực để thực thi của bạn.

CMake với đẩy mạnh thường trông giống như rằng:

set(Boost_USE_STATIC_LIBS  ON) # only find static libs 
set(Boost_USE_MULTITHREADED  ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 
find_package(Boost 1.57.0 COMPONENTS date_time filesystem system ...) 
if(Boost_FOUND) 
    include_directories(${Boost_INCLUDE_DIRS}) 
    add_executable(foo foo.cc) 
    target_link_libraries(foo ${Boost_LIBRARIES}) 
endif() 
+0

Tôi tình cờ gặp câu hỏi này và nó thực sự hoạt động để tôi không nhận được tập tin ** không tìm thấy ** - lỗi nữa ... tuy nhiên, Bây giờ tôi gặp lỗi mới: 'tệp STRINGS tệp /usr/local/Cellar/boost/1.57.0/boost/version.hpp" không thể được đọc.' ... Tôi đã cập nhật câu hỏi của mình, bất kỳ ý tưởng nào? – nburk

+2

Về mặt lý thuyết, bạn không cần phải thiết lập Boost_INCLUDE_DIR và Boost_LIBRARY_DIR, đó là công việc của dòng find_package (Boost) Và đừng quên dòng liên kết.Nếu lỗi vẫn còn tồn tại có thể có một cái nhìn về các quyền trên tập tin – Waxo

+1

Cảm ơn bạn Đó là một niềm vui để giúp đỡ, tôi có thời gian khó khăn khi tôi bắt đầu CMake, chúc may mắn – Waxo

Các vấn đề liên quan