2012-02-19 32 views
11

Tôi có một cấu trúc thư mục rất đơn giản: các fileCMake vị trí thực thi

Project 
Project/src 
Project/build 

Nguồn là trong Project/src, và tôi làm out-of-src xây dựng trong Project/build. Sau khi chạy cmake ../ ; make, tôi có thể chạy tệp thực thi như vậy: Project/build$ src/Executable - tức là, Executable được tạo trong thư mục build/src.

Làm cách nào để đặt vị trí của tệp thực thi trong tệp CMakeLists.txt? Tôi đã cố gắng làm theo một số ví dụ được tìm thấy tại cmake.org, nhưng các liên kết hoạt động dường như không hiển thị hành vi này.

Tệp Project/src/CMakeLists.txt của tôi được liệt kê tại đây.


include_directories(${SBSProject_SOURCE_DIR}/src) 
link_directories(${SBSProject_BINARY_DIR}/src) 

set (SBSProject_SOURCES 
    main.cpp 
    ) 

add_executable(TIOBlobs ${SBSProject_SOURCES}) 

Và cấp cao nhất Project/CMakeLists.txt:


cmake_minimum_required (VERSION 2.6) 
project (SBSProject) 

set (CMAKE_CXX_FLAGS "-g3 -Wall -O0") 

add_subdirectory(src) 

Trả lời

16

Bạn có một vài lựa chọn.

Để thay đổi vị trí mặc định của tệp thi hành, hãy đặt CMAKE_RUNTIME_OUTPUT_DIRECTORY đến vị trí mong muốn. Ví dụ, nếu bạn thêm

set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) 

để Project/CMakeLists.txttrước lệnh add_subdirectory của bạn, thực thi của bạn sẽ kết thúc trong Project/build cho Unix xây dựng hoặc build/<config type> cho Win32 xây dựng. Để biết thêm chi tiết, hãy chạy:

cmake --help-property RUNTIME_OUTPUT_DIRECTORY 

Tùy chọn khác cho dự án có kích thước này chỉ có một CMakeLists.txt. Bạn có thể thay thế nhiều hơn hoặc ít hơn add_subdirectory(src) với nội dung của Project/src/CMakeLists.txt để đạt được cùng một đường dẫn đầu ra.

Tuy nhiên, có một số vấn đề khác.

Có thể bạn muốn tránh sử dụng link_directories nói chung. Đối với một lời giải thích, chạy

cmake --help-command link_directories 

Thậm chí nếu bạn sử dụng link_directories, nó không chắc rằng bất kỳ thư viện sẽ được tìm thấy trong ${SBSProject_BINARY_DIR}/src

Một vấn đề khác là các CMAKE_CXX_FLAGS áp dụng đối với Unix xây dựng, vì vậy có lẽ nên được bọc trong một khối if (UNIX) ... endif(). Tất nhiên, nếu bạn không có kế hoạch xây dựng trên bất kỳ thứ gì ngoài Unix, thì đây không phải là vấn đề.

Cuối cùng, tôi khuyên bạn nên yêu cầu CMake 2,8 là mức tối thiểu, trừ khi bạn phải sử dụng 2,6 - CMake là một dự án tích cực phát triển và phiên bản hiện tại có nhiều cải tiến đáng kể so với 2,6

Vì vậy, một sự thay thế duy nhất cho Project/CMakeLists.txt có thể trông giống như:

cmake_minimum_required (VERSION 2.8) 
project (SBSProject) 

if (UNIX) 
    set (CMAKE_CXX_FLAGS "-g3 -Wall -O0") 
endif() 

include_directories (${SBSProject_SOURCE_DIR}/src) 

set (SBSProject_SOURCES 
    ${SBSProject_SOURCE_DIR}/src/main.cpp 
    ) 

add_executable (TIOBlobs ${SBSProject_SOURCES}) 
2

Một cách khác để di dời vị trí tập tin thực thi là thông qua set(EXECUTABLE_OUTPUT_PATH Dir_where_executable_program_is_located)

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