Làm cách nào để tạo đầu ra CMake thành thư mục 'bin'?


186

Tôi hiện đang xây dựng một dự án với cấu trúc plugin. Tôi đang sử dụng CMake để biên dịch dự án. Các plugin được biên dịch trong các thư mục riêng biệt. Vấn đề của tôi là CMake biên dịch và lưu các nhị phân và plugin, thư viện động, trong cấu trúc thư mục của nguồn. Làm cách nào để tạo CMake lưu các tệp trong thư mục ./bin ?

Câu trả lời:


298

Như trong câu trả lời của Oleg, tôi tin rằng biến chính xác cần đặt là CMAKE_RUNTIME_OUTPUT_DIRECTORY . Chúng tôi sử dụng như sau trong CMakeLists.txt gốc của chúng tôi:

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

Bạn cũng có thể chỉ định các thư mục đầu ra trên cơ sở theo từng mục tiêu:

set_target_properties( targets...
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

Trong cả hai trường hợp, bạn có thể thêm _[CONFIG]vào tên biến / tài sản để làm cho thư mục đầu ra áp dụng đối với một cấu hình cụ thể (các giá trị tiêu chuẩn cho cấu hình là DEBUG, RELEASE, MINSIZERELRELWITHDEBINFO).


8
Bạn cũng có thể ghi đè lên mục tiêu này trên cơ sở theo từng mục tiêu bằng cách đặt thuộc tính mục tiêu RUNTIME_OUTPUT_DIRECTORY. Xem tài liệu tại đây: cmake.org/cmake/help/ từ
DLRdave

4
Liên kết của DLRdave đã chết. Hãy thử cmake.org/cmake/help/v2.8.8/ Ấn
Nicu Stiurca

Làm thế nào để làm cho nó áp dụng cho tất cả các cấu hình cùng một lúc?
emlai

Ba lệnh đầu tiên sẽ áp dụng cho tất cả các cấu hình (cụ thể là cài đặt CMAKE_RUNTIME_OUTPUT_DIRECTORY). Bạn sẽ chỉ đặt CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG (ví dụ) nếu bạn muốn có một thư mục khác cho đầu ra gỡ lỗi. Hành vi chính xác phụ thuộc vào trình tạo / chuỗi công cụ bạn đang sử dụng (ví dụ: tệp dự án Visual Studio bao gồm tất cả các cấu hình trong một cây xây dựng, trong khi trình tạo tệp tạo tệp sẽ chỉ tạo tệp tạo tệp cho một cấu hình bản dựng).
Adam Bowen

1
Mục đích của việc thiết lập là gì CMAKE_ARCHIVE_OUTPUT_DIRECTORY, xem xét rằng lệnh install(TARGETS <target_name>)vẫn phàn nàn về việc "không đưa ra RUNTIME DESTINATION cho mục tiêu thực thi"? Biến này được cho là cung cấp một giá trị mặc định, do đó installlệnh không nên phàn nàn về sự vắng mặt của a RUNTIME DESTINATION.
thiagowfx

30

Sử dụng set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")


10
Sử dụng tên đường dẫn đầy đủ vào thư mục làm giá trị biến và không đặt dấu "/" trong giá trị ... như trong câu trả lời của Adam Bowen.
DLRdave

4
Tại sao bạn cần thêm đường dẫn đầy đủ? Có vẻ như là một sự phiền toái khi bạn di chuyển dự án của mình ...
ScottF

8

Sử dụng EXECUTABLE_OUTPUT_PATHbiến CMake để đặt đường dẫn cần thiết. Để biết chi tiết, tham khảo tài liệu CMake trực tuyến:

Tài liệu CMake 2.8.8


15
EXECUTABLE_OUTPUT_PATH vẫn hoạt động ngay bây giờ, nhưng là cách "cũ" để đạt được kết quả này. Câu trả lời của Adam Bowen là cách tiếp cận được đề xuất.
DLRdave

4

Đối với tôi, tôi đang sử dụng cmake 3.5, bên dưới ( set variable) không hoạt động:

set(
      ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
      LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
      RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
)

nhưng điều này hoạt động ( set set_target_properties):

set_target_properties(demo5
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
    LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
    RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
)

2
Tôi đang sử dụng câu trả lời của Adam với bộ (CMAKE _... và nó hoạt động, nhưng chỉ khi bạn làm điều đó trước khi thêm thư viện, thực thi, v.v. Tôi nghĩ đó là một lưu ý quan trọng cho những người mới bắt đầu như tôi.
ashrasmun

Ồ @ashrasmun đã cứu tôi khỏi phát điên sau vài giờ. Hoàn toàn không có gì hoạt động cho đến khi nhận ra rằng thứ tự của các lệnh này rất phù hợp.
động vật chân đốt

2
$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)

1

Tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi; xin vui lòng xin lỗi đánh máy.

sử dụng cấu hình dòng này:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
đặt bất kỳ dự án CMakeLists.txt nào của bạn.
$ {PRO DỰ_SOURCE_DIR} này là thư mục nguồn hiện tại của bạn, nơi đặt dự án.
và nếu đi lang thang tại sao $ {EXECUTABLE_OUTPUT_PATH}
kiểm tra tệp này CMakeCache.txtsau đó tìm kiếm từ khóa output path,
tất cả các biến được xác định ở đây, nó sẽ đưa ra lời giải thích đầy đủ về dự án setting·


0
cat CMakeLists.txt
project (hello)
set(CMAKE_BINARY_DIR "/bin")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
add_executable (hello hello.c)

8
Bạn có thể thêm một số lời giải thích cho câu trả lời của bạn?
Paul Floyd

0

Bất kể tôi định nghĩa điều này trong CMakeLists.txt chính hay trong từng cá nhân, nó vẫn cho rằng tôi muốn tất cả các lib và thùng ra khỏi đường dẫn chính, đó là giả định ít hữu ích nhất trong tất cả.


0

Để thêm vào điều này:

Nếu bạn đang sử dụng CMAKE để tạo giải pháp Visual Studio và bạn muốn Visual Studio xuất các tệp được biên dịch thành / bin, câu trả lời của Peter cần phải được sửa đổi một chút:

# set output directories for all builds (Debug, Release, etc.)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
    string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
    set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/bin )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.