Cách biên dịch mà không tối ưu hóa -O0 bằng CMake


17

Tôi đang sử dụng Khoa học Linux (SL). Tôi đang cố gắng biên dịch một dự án sử dụng một loạt các tệp C ++ (.cpp).

Trong thư mục user/project/Build, tôi nhập makeđể biên dịch và liên kết tất cả các tệp .cpp. Sau đó tôi phải đi user/run/và sau đó gõ./run.sh values.txt

Để gỡ lỗi với GDB, tôi phải đi đến user/runvà sau đó nhập gdb ../project/Build/bin/Projectvà chạy, tôi nhập run -Project INPUT/inputfile.txt. Tuy nhiên, tôi đang cố gắng in ra giá trị của biến bằng cách sử dụng p variablename.

Tuy nhiên, tôi nhận được tin nhắn s1 = <value optimized out>. Tôi đã thực hiện một số nghiên cứu trực tuyến và có vẻ như tôi cần phải biên dịch mà không tối ưu hóa bằng cách sử dụng -O0để giải quyết vấn đề này. Nhưng tôi phải nhập vào đâu? Trong CMakeLists? Nếu vậy, CMakeLists nào? Một trong project/Buildhay project/src/project?


Bạn đã thử đơn giản chạy lại cmake với kiểu xây dựng được đặt thành DEBUG chưa? ví dụ: (từ thư mục Build)cmake -DCMAKE_BUILD_TYPE=DEBUG ..
Steeldo

1
Tại sao điều này không được đăng trên Stack Overflow?
Peter Mortensen

Câu trả lời:


10

Câu trả lời của Chip rất hữu ích, tuy nhiên vì SETdòng ghi đè lên CMAKE_CXX_FLAGS_DEBUGđiều này đã loại bỏ -gmặc định khiến cho tệp thực thi của tôi được xây dựng mà không có thông tin gỡ lỗi. Tôi cần thực hiện một sửa đổi bổ sung nhỏ cho CMakeLists.txt trong thư mục nguồn dự án để có được một tệp thực thi được xây dựng với thông tin gỡ lỗi -O0 tối ưu hóa (trên phiên bản cmake 2.8.12.2).

Tôi đã thêm phần sau vào CMakeLists.txt để thêm -O0và để lại -gkích hoạt:

# Add -O0 to remove optimizations when using gcc
IF(CMAKE_COMPILER_IS_GNUCC)
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0")
    set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0")
ENDIF(CMAKE_COMPILER_IS_GNUCC)

Điều này thêm -O0tối ưu hóa cho các cờ đã được CMake sử dụng để gỡ lỗi và chỉ được bao gồm cho các bản dựng GCC nếu bạn tình cờ sử dụng một dự án đa nền tảng.



4

Thêm phần này vào CMakeLists.txt (cái trong thư mục nguồn dự án; không chạm vào bất cứ thứ gì trong thư mục bản dựng):

SET(CMAKE_CXX_FLAGS_DEBUG "-O0")
SET(CMAKE_C_FLAGS_DEBUG "-O0")

và sau đó

$ cmake -DCMAKE_BUILD_TYPE=Debug

sẽ làm việc. Hoặc chỉ cần thêm phần này vào CMakeLists.txt:

SET(CMAKE_CXX_FLAGS "-O0")
SET(CMAKE_C_FLAGS "-O0")
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.