2012-04-10 22 views
52

Tôi chỉ muốn gỡ lỗi một số mã chạy trên Linux và tôi cần một bản dựng gỡ lỗi (-O0 -ggdb). Vì vậy, tôi thêm vào những điều này để tôi CMakeLists.txt:cmake CFLAGS CXXFLAGS sửa đổi

set(CMAKE_BUILD_TYPE DEBUG) 
set(CMAKE_C_FLAGS "-O0 -ggdb") 
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb") 
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb") 
set(CMAKE_CXX_FLAGS "-O0 -ggdb") 
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb") 
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb") 

Khi tôi cố gắng biên dịch Tôi quay tiết về việc sử dụng make VERBOSE=1 Và tôi quan sát thấy đầu ra, như thế này

... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor 
-Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W 
-Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS 
-fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics 
-fvisibility=hidden -fvisibility-inlines-hidden **-g -O2** 
-fno-reorder-blocks -fno-schedule-insns -fno-inline ... 

Rõ ràng mã được biên dịch với "-g -O2" và đây không phải là điều tôi muốn. Làm thế nào tôi có thể buộc nó chỉ sử dụng "-O0 -ggdb"?

+1

Nếu bạn muốn xây dựng có thể gỡ lỗi, chỉ cần thực hiện gỡ lỗi cấu hình tại dòng lệnh. "cmake -DCMAKE_BUILD_TYPE = Gỡ lỗi". Kết quả xây dựng sẽ có các cờ gỡ lỗi trên cho hệ thống xây dựng đã cho. Không có lý do để sửa đổi các tập tin cmake chính nó. Bạn cũng có thể gửi giá trị CMAKE_C_FLAGS với đối số -D khác. – Atifm

Trả lời

47

Bạn cần đặt cờ sau lệnh project trong CMakeLists.txt của mình.

Ngoài ra, nếu bạn đang gọi số include(${QT_USE_FILE}) hoặc add_definitions(${QT_DEFINITIONS}), bạn nên bao gồm các lệnh set sau câu lệnh Qt vì các câu lệnh này sẽ gắn thêm cờ. Nếu trường hợp đó trường hợp, bạn có thể chỉ muốn gắn cờ của mình vào các cờ Qt, vì vậy hãy thay đổi thành ví dụ:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb") 
+0

Tôi đã đặt những lá cờ đó sau lệnh của dự án. Nhưng đầu ra là như nhau. – majie

+0

Tôi chỉ nhận thấy 'QT_NO_EXCEPTIONS' trong cờ của bạn, vì vậy tôi đã mở rộng câu trả lời của mình một chút. Tôi đoán rằng '$ {QT_DEFINITIONS}' đang nối thêm '-g -O2'. – Fraser

+1

Có, đây là nó. Đặt các lệnh 'set' sau khi các câu lệnh Qt giải quyết được vấn đề. Cảm ơn nhiều. – majie

9

Bạn phải thay đổi CAG mặc định C/CXX.

Theo CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} đặt trong chính CMakeLists.txt một trong số:

Đối với C

set(CMAKE_C_FLAGS_DEBUG "put your flags") 
set(CMAKE_C_FLAGS_MINSIZEREL "put your flags") 
set(CMAKE_C_FLAGS_RELWITHDEBINFO "put your flags") 
set(CMAKE_C_FLAGS_RELEASE "put your flags") 

Đối với C++

set(CMAKE_CXX_FLAGS_DEBUG "put your flags") 
set(CMAKE_CXX_FLAGS_MINSIZEREL "put your flags") 
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "put your flags") 
set(CMAKE_CXX_FLAGS_RELEASE "put your flags") 

này sẽ ghi đè các giá trị quy định tại CMakeCache.txt

2

Trên các hệ thống Unix, cho một số dự án, tôi đã thêm những dòng này vào CMakeLists.txt và nó đã được biên soạn thành công vì cơ sở (/usr/include) và địa phương bao gồm (/usr/local/include) đi vào các thư mục chia:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include -L/usr/local/lib") 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include") 
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib") 

Nó gắn thêm các thư mục chính xác, bao gồm đường dẫn cho C và C++ cờ biên dịch và đường dẫn thư mục chính xác cho những lá cờ mối liên kết.

Lưu ý: C++ (C++) không hỗ trợ -L, vì vậy chúng ta phải sử dụng CMAKE_EXE_LINKER_FLAGS

3

Giải pháp dễ nhất làm việc tốt cho tôi là thế này:

export CFLAGS=-ggdb 
export CXXFLAGS=-ggdb 

CMake sẽ nối cho tất cả các cờ cấu hình.

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