2013-03-13 27 views
8

Tôi có mã này trong cmake:cmake xác định không dường như nhận ra biến

#mandatory 
SET(BOOST_DIR "$ENV{BOOST_HOME}") 
if (DEFINED ${BOOST_DIR}) 
    #global include directories 
    include_directories(${BOOST_DIR}) 
else(DEFINED ${BOOST_DIR}) 
    message(STATUS "BOOST_HOME at ${BOOST_DIR}") 

    message(FATAL_ERROR "Undefined BOOST_HOME env var.") 
endif(DEFINED ${BOOST_DIR}) 

Các env var BOOST_HOME được định nghĩa (/ home/Ferran/tăng). Hành vi này rất lạ vì đầu ra là:

-- BOOST_HOME at /home/ferran/boost 
CMake Error at CMakeLists.txt:14 (message): 
    Undefined BOOST_HOME env var. 


-- Configuring incomplete, errors occurred! 

Vì vậy, var tồn tại và in nội dung của nó và cùng một lúc không tồn tại?

+0

Bạn đã đặt '$ ENV {BOOST_HOME}' như thế nào? –

Trả lời

21

Bạn cần phải tránh dereferencing biến BOOST_DIR trong báo cáo if:

set(BOOST_DIR "$ENV{BOOST_HOME}") 
if(BOOST_DIR)    # <--- Use 'BOOST_DIR', not 'DEFINED ${BOOST_DIR}' 
    #global include directories 
    include_directories(${BOOST_DIR}) 
else() 
    message(STATUS "BOOST_HOME at ${BOOST_DIR}") 
    message(FATAL_ERROR "Undefined BOOST_HOME env var.") 
endif() 

By dereferencing BOOST_DIR, bạn đang có hiệu quả truy vấn nếu CMake có một biến gọi là /home/ferran/boost xác định.

+0

Nó không hoạt động. Dường như trong trường hợp "$ ENV {BOOST_HOME}" không được xác định, BOOST_DIR được đặt thành rỗng, nhưng được xác định. Tôi đã giải quyết bằng cách sử dụng "if (DEFINED ENV {BOOST_HOME})" – Killrazor

+1

Có - xin lỗi. Đó là vì '" $ ENV {BOOST_HOME} "' có dấu ngoặc kép. Nếu những thứ đó không có ở đó và '$ ENV {BOOST_HOME}' không được định nghĩa, thì 'BOOST_DIR' cũng sẽ không được định nghĩa. Tuy nhiên, dấu ngoặc kép là cần thiết trong trường hợp giá trị 'BOOST_HOME' bao gồm một khoảng trắng. Tôi đã cập nhật câu trả lời với bản sửa lỗi hơi khác với của bạn. Hoặc là tốt. – Fraser

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