2011-07-31 37 views
52

Tôi có một CMakeLists.txt trong thư mục gốc của dự án và một trong thư mục/src của tôi. Cái trong thư mục/src chỉ chứa một biến với các tệp .cpp (set (SOURCEFILES main.cpp foo.cpp)) và trong thư mục gốc CMakeLists.txt tôi làm add_subdirectory(src) và sau đó tôi làm add_executable(MyApp ${SOURCEFILES}).phạm vi biến cmake, add_subdirectory

Nhưng cmake mang lại cho tôi những lỗi

add_executable gọi với số không chính xác của các đối số, không có nguồn cung cấp

Làm thế nào để tôi nhận được cmake để xem biến? Tôi đọc rằng cmake chỉ biết các biến toàn cầu, nhưng rõ ràng không phải là trường hợp ...

Trả lời

78

Như đã đề cập trong tài liệu của lệnh set, mỗi thư mục được thêm với add_subdirectory hoặc mỗi hàm được khai báo với function tạo một phạm vi mới.

Phạm vi con mới kế thừa tất cả các định nghĩa biến từ phạm vi gốc của nó. Các bài tập thay đổi trong phạm vi con mới với lệnh set sẽ chỉ hiển thị trong phạm vi con trừ khi tùy chọn PARENT_SCOPE được sử dụng.

Để thực hiện các nhiệm vụ SOURCEFILES có thể nhìn thấy trong thư mục gốc của dự án của bạn, hãy thử:

set (SOURCEFILES main.cpp foo.cpp PARENT_SCOPE) 
+2

Thanks, điều này giải quyết nó. Nhưng một lưu ý khác: trong thư mục con bạn có thể sử dụng '$ {CMAKE_CURRENT_SOURCE_DIR}/foo.cpp' thay vì chỉ' foo.cpp' vì cmake bây giờ nằm ​​trong phạm vi cha. – blubberbernd

+2

Ngoài ra, bạn có thể đặt biến trong tệp CMakeLists.txt gốc trước cuộc gọi add_subdirectory và có định nghĩa của nó được kế thừa xuống tệp con CMakeLists. Một lần nữa, bạn sẽ cần phải đủ điều kiện tên của các tập tin nếu bạn cần phải tham khảo chúng từ nhiều tập tin CMakeLists. – DLRdave

+5

Bạn cũng cần tạo biến trong phạm vi hiện tại để sử dụng các giá trị của nó trong thư mục con/hàm: 'set (giá trị VAR PARENT_SCOPE); được đặt (VAR $ {VAR}); ' –