Helpex - Trao đổi & giúp đỡ Đăng nhập
42

Tôi đang sử dụng CMake để xây dựng các dự án của mình trên Windows (Visual Studio) cũng như trên máy Linux (gcc). Tôi muốn đánh dấu một số mã là "chỉ gỡ lỗi", như với

#ifdef DEBUG
//some logging here
#endif

Câu hỏi đặt ra là: định nghĩa trình biên dịch nào có sẵn trên tất cả các nền tảng trong kiểu xây dựng CMake "Debug"? DEBUG dường như không tồn tại. (Tôi muốn ghi nhật ký hoặc bất cứ thứ gì chỉ khi loại xây dựng là Gỡ lỗi.)

42 hữu ích 1 bình luận 35k xem chia sẻ
112

CMake thêm -DNDEBUGvào CMAKE_C_FLAGS_ {RELEASE, MINSIZEREL} theo mặc định. Vì vậy, bạn có thể sử dụng #ifndef NDEBUG.

112 hữu ích 3 bình luận chia sẻ
28

Tôi đề nghị bạn thêm định nghĩa của riêng bạn. Các CMakebiểu tượng CMAKE_C_FLAGS_DEBUGcó thể chứa cờ chỉ được sử dụng trong chế độ gỡ lỗi. Ví dụ:

C:

set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DMY_DEBUG")

C++:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DMY_DEBUG")

Sau đó, trong mã của bạn, bạn có thể viết như sau:

#ifdef MY_DEBUG
// ...
#endif

(Có thể, bạn sẽ phải sử dụng "/DMY_DEBUG"cho studio trực quan.)

28 hữu ích 5 bình luận chia sẻ
19

Trong CMake> = 2.8, sử dụng target_compile_definitions:

target_compile_definitions(MyTarget PUBLIC "$<$<CONFIG:DEBUG>:DEBUG>")

Khi biên dịch ở chế độ Gỡ lỗi, điều này sẽ xác định biểu tượng Gỡ lỗi để sử dụng trong mã của bạn. Nó sẽ hoạt động ngay cả trong các IDE như Visual Studio và Xcode mà cmake tạo ra một tệp duy nhất cho tất cả các chế độ biên dịch.

Bạn phải làm điều này cho từng mục tiêu [1]. Ngoài ra, bạn có thể sử dụng add_compile_options(Cmake> = 3.0):

add_compile_options("$<$<CONFIG:DEBUG>:-DDEBUG>")

Lưu ý rằng các phiên bản gần đây của Visual C ++ (ít nhất là từ VS2015) cho phép / hoặc - cho các tham số, vì vậy nó sẽ hoạt động tốt trên các trình biên dịch. Lệnh này cũng hữu ích cho các tùy chọn biên dịch khác mà bạn có thể muốn thêm ("/ O2" trong chế độ phát hành cho MSVC hoặc "-O3" cho chế độ phát hành trong G ++ / Clang)

[1]: Lưu ý: trong CMake> = 3.12 (hiện tại là phiên bản beta) cũng có một add_compile_definitionsbiểu thức hỗ trợ trình tạo, ảnh hưởng đến tất cả các mục tiêu.

19 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ c++ c cmake , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading