2014-09-09 19 views
5

Mặc dù dễ dàng tìm thấy thông tin mức bề mặt về cách sử dụng CMake, thông tin về cách sử dụng CMake đúng cách có vẻ cực kỳ khó tìm. Làm thế nào nên trong một dự án CMake có kích thước rất lớn (một tệp thực thi, một hoặc nhiều thư viện tĩnh được thực thi bởi tệp thực thi đó, một hoặc nhiều phụ thuộc bên ngoài được sử dụng bởi các thư viện tĩnh) các thư mục và tệp CMakeList.txt được sắp xếp? Những gì CMakeList.txt tập tin nên có những gì lệnh?Cách thiết lập dự án CMake chính xác?

+1

Bạn đã đọc Wiki http://www.cmake.org/Wiki/CMake trên cmake trang web? –

+0

@SergeiNikulov Trích dẫn: 'Bạn hiện đang ở trên trang wiki CMake. Nhiều trang hiện không được NHẬN ĐỊNH và đôi khi được coi là thực hành không tốt. Chúng chỉ được lưu giữ như là tài liệu tham khảo cho các phiên bản CMake trước đó. ” – Zingam

Trả lời

3

Một cách tốt để tìm hiểu làm thế nào để sử dụng một cách hiệu quả CMake là bằng cách nhìn vào các dự án khác. LLVM và các tiểu dự án của nó là một ví dụ điển hình.

Nói chung, các phương pháp mã hóa tốt chuyển đổi sang thực tiễn CMake tốt; bạn muốn mô đun, một phong cách rõ ràng và linh hoạt.

Ví dụ về điều này có thể là có quy tắc để xây dựng tệp thi hành của bạn bên trong thư mục src, sau đó sử dụng mục tiêu đó trong thư mục dự án gốc. Một cái gì đó như thế này:

-my_proj 
| 
----CMakeLists.txt //contains directives for top-level dependencies and linking, includes subfolders 
----src 
    | 
    ----CMakeLists.txt //contains definition of your main executable target 
    ----internal_lib 
     | 
     ----CMakeLists.txt //contains definition of your internal static libraries 

my_proj/CMakeLists.txt

add_subdirectory(src) 
find_package (Threads REQUIRED) #find pthreads package 
target_link_libraries (my_exe my_lib ${CMAKE_THREAD_LIBS_INIT}) #link against pthreads and my_lib 

my_proj/src/CMakeLists.txt

add_subdirectory(internal_lib) 
add_executable(my_exe my_source1.cpp mysource2.cpp) 

my_proj/src/internal_lib/CMakeLists.txt

add_library(my_lib my_lib_source1.cpp my_lib_source2.cpp) 
+0

Bạn có thể bao gồm một ví dụ rất đơn giản về những tập tin CMakeLists.txt này sẽ như thế nào? –

+0

@ruslo, một điểm công bằng, nhưng chúng được nhận xét khá tốt và cho thấy việc sử dụng một loạt các tính năng, nhiều hơn tôi có thể nói cho nhiều ví dụ khác. Ngoài ra, các CMakeLists trở nên đơn giản hơn khi bạn hạ xuống cấu trúc thư mục; Tôi hy vọng rằng bất cứ ai cũng có thể hiểu các tệp để xây dựng các thư viện tĩnh nội bộ, chẳng hạn. – TartanLlama

1

Tôi hy vọng this tutorial chính xác là những gì bạn cần để bắt đầu với cấu hình CMake cho một dự án đơn giản bao gồm một tệp thực thi và một số thư viện - hãy xem! Tôi tìm ra CMake by Example anyway các khả năng tốt nhất để học CMake một cách dễ dàng:

Sử dụng CMake với thực thi

add_executable(myapp main.c) 

Sử dụng CMake với các thư viện tĩnh

add_library(test STATIC test.c) 

Sử dụng CMake với thư viện động

add_library(test SHARED test.c) 

thư viện liên kết để thực thi với CMake

add_subdirectory(libtest_project) 

add_executable(myapp main.c) 

target_link_libraries(myapp test) 
+1

Nếu bạn quan tâm, bạn có thể cải thiện hướng dẫn này một chút, sử dụng: [cmake -H. -B_builds] (http://stackoverflow.com/a/20611964/2288008) để xây dựng dự án (thay vì 'mkdir _builds && cd _builds && cmake ..'). 'make' và' make install' sẽ chỉ làm việc cho makefile, bạn có thể sử dụng 'cmake --build _builds' và' cmake --build _builds --target install' cho bất kỳ loại trình tạo nào. Ngoài ra khi bạn sử dụng 'ExternalProject_Add' như thế bạn không thể sử dụng các mô-đun' find_package'. –

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