2011-12-19 42 views
20

Tôi cố gắng thiết lập macro tiền xử lý trong dòng lệnh của CMake. Tôi đã thử:Cách xác định macro tiền xử lý C++ thông qua dòng lệnh với CMake?

set generator="Visual Studio 8 2005" 
set params=-D MY_MACRO=1 
cmake.exe -G %generator% %params% ..\some_project 

nhưng nó không được định nghĩa khi tôi biên dịch cũng không phải tôi có thể tìm thấy tên MY_MACRO trong các tập tin được tạo ra bởi CMake ở tất cả, trừ CMakeCache.txt nơi nó hiện diện trong các hình thức:

MY_MACRO:UNINITIALIZED=1 

Tôi có thể làm như thế nào?

+1

Nếu bạn giải quyết điều này bây giờ tôi sẽ quan tâm đến giải pháp –

+1

@TimMeyer: Không. Rõ ràng là không thể. – ybungalobill

+0

@ybungalobill: Bạn không thể chèn macro từ dòng lệnh, bạn chỉ có thể sửa đổi các macro hiện có được xác định trong CMakeLists.txt. Ngoài ra, * đặt params = -D MY_MACRO = 1 * nên * đặt params = -DMY_MACRO = 1 * – NeoH4x0r

Trả lời

6

Hãy thử điều này: -D CMAKE_CXX_FLAGS=/DMY_MACRO=1

+3

Nó thực sự là một nửa. Nó ghi đè giá trị của 'CMAKE_CXX_FLAGS'. Tôi đã thử '-D CMAKE_CXX_FLAGS ="/DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS} "' nhưng '$ {CMAKE_CXX_FLAGS}' không được mở rộng. Có ai biết sửa nó không? – ybungalobill

+0

Các chuỗi được trích dẫn kép trên dòng lệnh sẽ được mở rộng bằng bash. Vì bạn không có biến môi trường có tên CMAKE_CXX_FLAGS, bash sẽ mở rộng nó thành "", trước khi cmake thậm chí nhìn thấy nó. Thay vào đó, hãy sử dụng dấu ngoặc đơn. – Tolli

+0

@Tolli dường như không hoạt động. Nó ngăn chặn bash mở rộng biến, nhưng cmake cũng không mở rộng nó. Nó chuyển giá trị chữ '/ DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS}' trực tiếp tới trình biên dịch. – pavon

-5

Trừ khi bạn có một lý do chính đáng không, bạn nên sử dụng ADD_DEFINITIONS(<name>=<value>[, ...]).

Chỉ cần thêm dòng sau vào CMakeLists.txt của bạn:

ADD_DEFINITIONS("MY_MACRO=1") 

CMake sẽ chăm sóc của các cú pháp của công tắc (có thể là -D<name>=<value>, hoặc /D<name>=<value>).

+13

sửa đổi CMakeLists.txt không được tính là giải pháp dòng lệnh. Và vâng, tôi có lý do chính đáng để không làm điều này. Tôi phải tự động hóa quá trình xây dựng, và tôi * không nên * thay đổi các nguồn. – ybungalobill

+0

Xin lỗi về không gian; Tôi muốn thêm một giải pháp dòng lệnh, nhưng nó không hoàn toàn là những gì bạn đang tìm kiếm. Tuy nhiên, làm điều đó từ dòng lệnh sẽ chỉ làm cho ngày của bạn khốn khổ, tin tôi đi. – hiobs

+0

Đôi khi dòng lệnh hữu dụng hơn ứng dụng gui và đôi khi không. Tôi thực sự không nghĩ rằng bạn có thể nói rằng điều này sẽ làm cho ngày của bạn khốn khổ, vì nó thực sự phụ thuộc vào tình hình, kỹ năng của người sử dụng, và sở thích cá nhân. – NeoH4x0r

14

Một lựa chọn tốt sẽ được xác định là một lựa chọn cmake:

OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default 

Tiếp theo là một điều kiện:

IF(DEFINE_MACRO) 
    ADD_DEFINITIONS(-DMACRO) 
ENDIF(DEFINE_MACRO) 

Sau đó, bạn có thể bật tùy chọn mà ON/OFF thông qua dòng lệnh với cmake sử dụng -D cờ. Ví dụ:

cmake -DDEFINE_MACRO=OFF .. 

Để đảm bảo trình biên dịch đang nhận được quyền định nghĩa, bạn có thể gọi thực hiện trong chế độ verbose và kiểm tra vĩ mô được xác định hay không:

make VERBOSE=1 

Đây là một giải pháp tốt cũng vì make sẽ biên dịch lại mã của bạn khi bất kỳ tùy chọn thay đổi cmake nào.

+2

Điều này đòi hỏi phải sửa đổi các CMakeLists, vì vậy nó không phải là một giải pháp (-1). – ybungalobill

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