Gỡ lỗi và phát hành trong CMake


434

Trong một dự án do GCC biên soạn,

  • Làm cách nào để tôi chạy CMake cho từng loại mục tiêu (gỡ lỗi / phát hành)?
  • Làm cách nào để chỉ định gỡ lỗi và phát hành cờ C / C ++ bằng CMake?
  • Làm thế nào để tôi thể hiện rằng tệp thực thi chính sẽ được biên dịch cùng g++và một thư viện lồng nhau với gcc?

Câu trả lời:


656

Với CMake, thông thường nên thực hiện xây dựng "ngoài nguồn" . Tạo của bạn CMakeLists.txttrong thư mục gốc của dự án của bạn. Sau đó, từ gốc của dự án của bạn:

mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make

Và cho Debug(một lần nữa từ gốc của dự án của bạn):

mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make

Release/ Debugsẽ thêm các cờ thích hợp cho trình biên dịch của bạn. Ngoài ra còn có RelWithDebInfoMinSizeRelxây dựng cấu hình.


Bạn có thể sửa đổi / thêm vào các cờ bằng cách chỉ định tệp toolchain mà bạn có thể thêm CMAKE_C_FLAGS_DEBUGCMAKE_C_FLAGS_RELEASEcác biến, ví dụ:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")

Xem CMAKE_BUILD_TYPE để biết thêm chi tiết.


Đối với câu hỏi thứ ba của bạn, tôi không chắc chính xác những gì bạn đang hỏi. CMake sẽ tự động phát hiện và sử dụng trình biên dịch phù hợp cho các tệp nguồn khác nhau của bạn.


3
Bạn cũng có thể thực hiện cmake -i ..thay thế, vì vậy cmake sẽ chạy tương tác, hỏi bạn loại xây dựng nào bạn muốn (Không có, Phát hành, Gỡ lỗi, MinSizeRel, RelWithDebInfo).
thiagowfx

5
-iTùy chọn @thiagowfx dẫn đến thông báo lỗi này : The "cmake -i" wizard mode is no longer supported.. Tôi đang sử dụng cmake 3.7.1
Philipp Claßen

3
Quan sát tốt đẹp. Có vẻ như nó đã bị phản đối kể từ phiên bản 3.0.0. Tham khảo .
thiagowfx

7
Đây KHÔNG phải là một bản dựng nguồn nếu bạn đang tạo một thư mục con! Bạn nên tạo thư mục xây dựng bên ngoài / phía trên thư mục nguồn.
Victor Lamoine

Lưu ý rằng nếu CMAKE_BUILD_TYPEkhông được đặt, cmake sẽ không chọn bất kỳ loại bản dựng mặc định nào, do đó dòng lệnh trình biên dịch được tạo sẽ không khớp với bất kỳ cấu hình bản dựng nào.
David

22

Đối với các cờ gỡ lỗi / phát hành, hãy xem CMAKE_BUILD_TYPEbiến (bạn chuyển nó dưới dạng cmake -DCMAKE_BUILD_TYPE=value). Phải mất giá trị như Release, Debugvv

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variabled#compilers-and-tools

cmake sử dụng phần mở rộng để chọn trình biên dịch, vì vậy chỉ cần đặt tên cho tệp của bạn .c.

Bạn có thể ghi đè lên điều này với các cài đặt khác nhau:

Ví dụ:

set_source_files_properties(yourfile.c LANGUAGE CXX) 

Sẽ biên dịch tập tin .c với g ++. Liên kết ở trên cũng cho thấy cách chọn một trình biên dịch cụ thể cho C / C ++.


15

Thay vì thao tác CMAKE_CXX_FLAGStrực tiếp các chuỗi (có thể được thực hiện độc đáo hơn bằng cách sử dụng string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")btw), bạn có thể sử dụng add_compiler_options:

add_compile_options(
  "-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
  "$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)

Điều này sẽ thêm các cảnh báo được chỉ định cho tất cả các loại bản dựng, nhưng chỉ các cờ gỡ lỗi đã cho cho bản DEBUGdựng. Lưu ý rằng các tùy chọn biên dịch được lưu trữ dưới dạng danh sách CMake, đây chỉ là một chuỗi phân tách các thành phần của nó bằng dấu chấm phẩy ;.


2
Không list(APPEND CMAKE_CXX_FLAGS_DEBUG "-g3")thêm dấu chấm phẩy trước khi -g3 chấm dứt lệnh và bắt đầu một lệnh mới -g3 chắc chắn sẽ thất bại?
cburn11

Bạn nói đúng CMAKE_CXX_FLAGSkhông một danh sách cmake nhưng một chuỗi các không gian tách cờ dòng lệnh. Tôi thấy hành vi đó không nhất quán ...
sebastian

add_compile_options () gọn gàng. Nó được bổ sung bởi add_link_options () khi bạn cần thêm tùy chọn vào trình liên kết, chẳng hạn như -fsanitize = address.
Bowie Owens

1
Đây có phải vẫn là cách thích hợp trong năm 2020 / cmake 3.17? Dòng cuối cùng có vẻ khó chịu
Jay

8

Nếu bạn muốn xây dựng một cấu hình khác mà không cần tạo lại nếu sử dụng bạn cũng có thể chạy cmake --build {$PWD} --config <cfg>Đối với các công cụ đa cấu hình, hãy chọn <cfg>ex. Gỡ lỗi, phát hành, MinSizeRel, RelWithDebInfo

https://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir


Tôi đã cố gắng chơi với --configtùy chọn mà không có kết quả. Nó không ảnh hưởng đến $<CONFIG>biến -DCMAKE_BUILD_TYPE=.
loshad vtapkah

4

// CMakeLists.txt: phát hành

set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)

// CMakeLists.txt: gỡ lỗi

set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)

9
Tôi không hiểu tại sao điều này lại được bình chọn, đó là mã thực sự được sử dụng trong sản xuất, nhưng tôi không quan tâm.
sailfish009

5
Có thể bởi vì theo các tài liệu CMake CMAKE_CONFIGURATION_TYPESchứa các giá trị có thể cho CMAKE_BUILD_TYPE. Vì vậy, bạn nên đặt cái sau như những câu trả lời khác gợi ý. Có thể giải pháp của bạn hoạt động vì nó giới hạn các lựa chọn có thể cho lựa chọn bạn muốn có.
bjhend

2
Upvote vì điều này sẽ làm việc. Tôi yêu tôi một số CMake nhưng có những điều kỳ quặc và đôi khi bạn cần sử dụng búa lớn để khiến mọi thứ hoạt động. Tôi có một số dự án vì lý do này hay lý do khác sẽ từ chối cờ dòng lệnh.
cory.todd

Dưới đây là một số thông tin bổ sung về lý do tại sao cài đặt có thể không hoạt động: stackoverflow.com/a/24470998/3196753
tresf 26/03/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.