2011-09-13 41 views
6

tôi có một phần của mã được điều kiện kích hoạt tùy thuộc vào một #define, như thế này:Làm cách nào để xác định biến khi tôi gọi CMake, sao cho qtcreator biết nó được xác định?

#ifdef VARIABLE 
    code.function(); 
#endif 

Kịch bản cmake có lệnh 'tùy chọn' mà đặt BIẾN như thế này:

option(VARIABLE "Want to use VARIABLE?" ON) 

if(VARIABLE) 
    message(STATUS "VARIABLE") 
    set(VARIABLE_FLAG "-DVARIABLE") 
endif() 

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${VARIABLE_FLAG} -Wall") 

Tôi đang sử dụng cmake để xây dựng dự án và qtcreator như IDE. Vấn đề của tôi là qtcreator nghĩ rằng VARIABLE không được định nghĩa sao cho mã của tôi không được đánh dấu, nhưng khi tôi xây dựng nó trên một giao diện điều khiển, VARIABLE được định nghĩa. Vì vậy, những thông số nào tôi nên vượt qua để qtcreator để chạy cmake, để nó biết VARIABLE được định nghĩa và làm nổi bật mã của tôi? Có cách nào để làm việc này không?

Ps: Tôi chỉ sử dụng qtcreator để chỉnh sửa tệp, phần xây dựng được thực hiện thông qua các lệnh trên bảng điều khiển.

Trả lời

5

Một lựa chọn khác là sử dụng một tập tin tiêu đề cấu hình, và bao gồm nó duy nhất mà bạn cần định nghĩa:

# in CMakeLists.txt 
configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/my_defs.h.in 
    ${CMAKE_CURRENT_BINARY_DIR}/my_defs.h 
) 

include_directories(${CMAKE_CURRENT_BINARY_DIR}) 

// in my_defs.h.in 
#cmakedefine VARIABLE 
    // configure_file converts #cmakedefine of a named CMake variable 
    // into a C++ #define of a C++ pre-processor symbol 

và cuối cùng

// in various C++ source or header files, but only as needed: 
#include "my_defs.h" 
#ifdef VARIABLE 
    doSome_VARIABLE_SpecificStuff(); 
#endif 

tôi không sử dụng QtCreator thường xuyên, vì vậy tôi không biết liệu kỹ thuật này có hoạt động theo cú pháp của chúng hay không làm nổi bật, nhưng tôi cho rằng điều đó sẽ xảy ra, vì họ phải đọc các tệp tiêu đề để thực hiện công việc phù hợp ...

+0

Sự phức tạp hơn tôi chỉ muốn sửa lỗi cú pháp của qtcreator, nhưng nó hoạt động. Bên cạnh đó, tôi đã học được cách cấu hình các tập tin tiêu đề bằng cmake, vì vậy tôi nghĩ đó là một câu trả lời tuyệt vời. Ngoài ra, cảm ơn vì đã làm cho câu hỏi của tôi rõ ràng hơn. – Salsa

+0

Bạn được chào đón! Nói chung, tôi nghĩ tốt nhất nên sử dụng tệp tiêu đề chỉ được bao gồm khi cần thiết để thực hiện một việc như thế này. Bằng cách đó, chỉ các tệp cần xây dựng lại mới được xây dựng lại sau khi thay đổi giá trị VARIABLE trong CMake ... Cách tốt nhất thứ hai là sử dụng add_definitions() ở tệp CMakeLists cấp cao nhất để tất cả các tệp đã biên dịch nhận được Định nghĩa. Nhưng sau đó nếu bạn thay đổi giá trị trong CMake, nó dẫn đến việc xây dựng lại hoàn toàn. – DLRdave

3

Hãy xem add_definitions(). Nó bổ sung thêm một tiền xử lý-xác định để trình biên dịch và có thể được sử dụng như bất kỳ bình thường #define:

add_definitions(-DVARIABLE) 

Tuy nhiên ... Tôi không chắc chắn nếu điều này sẽ làm cho QtCreator nhặt nó lên như một 'biến được biết đến.

+0

Tôi đã thử một cái gì đó tương tự, chỉ cần không sử dụng add_definitions. Dù sao, nó không hoạt động. Có vẻ như qtcreator bỏ qua các định nghĩa trình biên dịch. – Salsa

+0

Đối với những gì nó có giá trị: trên Qt Creator 4.1.0, sử dụng "add_definitions (-DVARIABLE)" theo đề xuất của Andre dường như có ảnh hưởng đến cách Qt Creator hiển thị tiền xử lý xác định. –

1

Bạn cũng có thể sử dụng tệp project_name.config. Nó được sử dụng đặc biệt cho nhu cầu của bạn. Bạn có thể thêm các định nghĩa chỉ được giải thích bởi QtCreator để làm nổi bật và tự động hoàn thành.

Tệp này thường nằm trong thư mục gốc của dự án của bạn.

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