2012-04-03 24 views
13

Tôi muốn sử dụng cmake để tạo tệp xây dựng của mình cho dự án C++. Tôi hiện có Makefile. Tôi gặp sự cố khi tạo số này Makefile sử dụng cú pháp chuẩn cmake.Tạo tệp CMakeLists từ Makefile hiện tại

Làm cách nào để bao gồm các thư viện chuẩn C++ như -lstdc++ -lpthread -lboost_thread-mt trong phần TARGET_LINK_LIBRARIES của cmake? Hoặc những tệp này nên được bao gồm trong phần ADD_DEPENDENCIES.

(OR) Có một công cụ đơn giản mà tạo ra một tập tin CMakeList.txt từ một Makefile

Trả lời

9

Thật không may, không có đơn giản 1: 1 chuyển đổi từ Makefiles để CMakeLists. Vì CMake được cho là chạy trên tất cả các nền tảng, nó không thể dựa vào các giả định cụ thể của nền tảng như GNU làm, điều này làm phức tạp mọi thứ ở một số nơi nhất định.

Cụ thể, CMake cung cấp một cơ chế rất mạnh mẽ và khá phức tạp để sử dụng thư viện: Bạn gọi find_package với tên thư viện, sẽ gọi tập lệnh tìm kiếm thư viện từ đường dẫn mô-đun cmake của bạn. Kịch bản này (cũng được viết bằng CMake) sẽ cố gắng phát hiện vị trí của các tệp thư mục và lib của thư viện và lưu chúng trong một vài biến CMake mà sau đó có thể được chuyển tới các lệnh CMake như include_directories và target_link_libraries.

Có hai vấn đề với cách tiếp cận này: Trước tiên, bạn cần tập lệnh tìm kiếm. May mắn thay, CMake có các kịch bản tìm kiếm cho Pthreads, Boost và một vài thứ khác, nhưng nếu bạn đang sử dụng một thư viện kỳ ​​lạ hơn, bạn có thể phải tự viết kịch bản tìm kiếm, đó là một trải nghiệm phức tạp ...

Vấn đề lớn thứ hai là không có cách nào tiêu chuẩn cho tập lệnh tìm kiếm trả về kết quả của nó. Mặc dù có các quy ước đặt tên cho các biến được sử dụng, các quy ước này thường không áp dụng. Trong thực tế điều đó có nghĩa là bạn sẽ phải kiểm tra nguồn của tập lệnh tìm kiếm để biết cách sử dụng nó. May mắn thay, các kịch bản đi kèm với CMake chủ yếu được viết rất tốt.

Các tập lệnh dựng sẵn được đặt ở đâu đó như <cmake-install-prefix>/share/cmake-2.8/Modules. Đối với câu hỏi của bạn, hãy xem các tệp FindBoost.cmake và FindThreads.cmake (CMake sẽ tự động liên kết với thư viện chuẩn). Anycorn đã đưa ra một số mã mẫu để sử dụng kịch bản lệnh Boost, mọi thứ khác bạn cần biết là trong tài liệu CMake hoặc trực tiếp trong các tệp kịch bản tìm kiếm.

2

Như thế này:

target_link_libraries(your-target-name pthread boost_thread-mt etc) 

Bạn không nên sử dụng add_dependencies khi bạn muốn liên kết các thư viện. Liên kết ngụ ý sự phụ thuộc, nhưng sự phụ thuộc một mình sẽ không đủ khi bạn cần liên kết.

2

Với Boost bạn thực sự cần phải sử dụng gói công cụ tìm

set(Boost_ADDITIONAL_VERSIONS "1.46" "1.46.0" "1.46.1") 
    set(Boost_USE_MULTITHREADED ON) # for -mt 
    find_package(Boost COMPONENTS thread) 
    if(Boost_FOUND) 
    MESSAGE(STATUS "Found Boost: ${Boost_LIBRARY_DIRS}") 
    MESSAGE(STATUS "Found Boost libraries: ${Boost_LIBRARIES}") 
    set(LIBRARIES "${LIBRARIES};${Boost_LIBRARIES}") 
    else() 
    MESSAGE(FATAL_ERROR "Boost Thread NOT FOUND") 
    endif() 

target_link_libraries(executable ${LIBRARIES}) 
Các vấn đề liên quan