ฉันจะสร้างเอาต์พุต CMake ให้เป็น 'bin' dir ได้อย่างไร


187

ขณะนี้ฉันกำลังสร้างโครงการด้วยโครงสร้างปลั๊กอิน ฉันใช้ CMake เพื่อรวบรวมโครงการ ปลั๊กอินจะรวบรวมในไดเรกทอรีที่แยกต่างหาก ปัญหาของฉันคือ CMake รวบรวมและบันทึกไบนารีและปลั๊กอินไลบรารีแบบไดนามิกในโครงสร้างไดเรกทอรีของแหล่งที่มา ฉันจะทำให้ CMake บันทึกไฟล์ในบางสิ่งเช่นไดเรกทอรี. / bin ได้อย่างไร

คำตอบ:


301

ในฐานะที่เป็นคำตอบของ Oleg ผมเชื่อว่าตัวแปรที่ถูกต้องเพื่อเป็นชุดCMAKE_RUNTIME_OUTPUT_DIRECTORY เราใช้สิ่งต่อไปนี้ในรูต CMakeLists.txt ของเรา:

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)

นอกจากนี้คุณยังสามารถระบุไดเรกทอรีที่ส่งออกในแต่ละเป้าหมาย:

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"
)

ในทั้งสองกรณีคุณสามารถผนวก_[CONFIG]กับชื่อตัวแปร / คุณสมบัติที่จะทำให้ไดเรกทอรีออกนำไปใช้กับการกำหนดค่าที่เฉพาะเจาะจง (ค่ามาตรฐานสำหรับการกำหนดค่าDEBUG, RELEASE, MINSIZERELและRELWITHDEBINFO)


8
คุณสามารถลบล้างสิ่งนี้ได้ตามเป้าหมายโดยตั้งค่าคุณสมบัติเป้าหมาย RUNTIME_OUTPUT_DIRECTORY ดูเอกสารที่นี่: cmake.org/cmake/help/…
DLRdave

4
ลิงก์ของ DLRdave นั้นตายแล้ว ลองcmake.org/cmake/help/v2.8.8/…
Nicu Stiurca

วิธีที่จะทำให้มันใช้กับการกำหนดค่าทั้งหมดในครั้งเดียว?
emlai

สามคำสั่งแรกควรใช้กับการกำหนดค่าทั้งหมด (โดยเฉพาะการตั้งค่า CMAKE_RUNTIME_OUTPUT_DIRECTORY) คุณจะตั้งค่า CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG (ตัวอย่าง) เท่านั้นหากคุณต้องการไดเรกทอรีที่แตกต่างสำหรับการดีบักเอาต์พุต ลักษณะการทำงานที่แน่นอนขึ้นอยู่กับเครื่องกำเนิด / toolchain ที่คุณใช้ (ตัวอย่างเช่นไฟล์โครงการ Visual Studio รวมการกำหนดค่าทั้งหมดในหนึ่งบิลด์แผนผัง
Adam Bowen

1
อะไรคือจุดประสงค์ของการตั้งค่าCMAKE_ARCHIVE_OUTPUT_DIRECTORYโดยพิจารณาว่าคำสั่งinstall(TARGETS <target_name>)ยังคงบ่นเกี่ยวกับ "ไม่ได้กำหนดปลายทางสำหรับเป้าหมายที่สามารถใช้งานได้" ตัวแปรนี้คาดคะเนให้ค่าเริ่มต้นดังนั้นคำสั่งไม่ควรบ่นเกี่ยวกับกรณีที่ไม่มีการinstall RUNTIME DESTINATION
thiagowfx

30

ใช้ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")


10
ใช้ชื่อพา ธ เต็มไปยังไดเรกทอรีเป็นค่าตัวแปรและอย่าใส่ "/" ต่อท้ายในค่า ... ตามคำตอบของ Adam Bowen
DLRdave

4
ทำไมคุณต้องเพิ่มเส้นทางแบบเต็ม? ดูเหมือนว่าน่ารำคาญเมื่อคุณย้ายโครงการของคุณ ...
ScottF

8

ใช้EXECUTABLE_OUTPUT_PATHตัวแปร CMake เพื่อกำหนดเส้นทางที่ต้องการ สำหรับรายละเอียดโปรดดูเอกสารประกอบของ CMake ออนไลน์:

CMake 2.8.8 เอกสารประกอบ


15
EXECUTABLE_OUTPUT_PATH ยังคงใช้งานได้ในขณะนี้ แต่เป็นวิธี "เก่า" ในการบรรลุผลนี้ คำตอบของ Adam Bowen เป็นแนวทางที่แนะนำ
DLRdave

4

สำหรับฉันฉันใช้ cmake 3.5 ด้านล่าง ( set variable) ไม่ทำงาน:

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/"
)

แต่งานนี้ ( 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
ฉันใช้คำตอบของอดัมกับชุด (CMAKE _... และใช้งานได้ แต่เมื่อคุณทำก่อนเพิ่มไลบรารี่ไฟล์เอ็กซีคิวต์ ฯลฯ ฉันคิดว่ามันเป็นโน้ตสำคัญสำหรับผู้เริ่มต้นเช่นฉัน
Ashrasmun

ว้าว. @ashrasmun ช่วยฉันไม่ให้บ้าหลังจากไม่กี่ชั่วโมง ไม่มีอะไรทำงานได้จริงจนกระทั่งตระหนักว่าลำดับของคำสั่งเหล่านี้มีความเกี่ยวข้องมาก
รพสัตว์รพ


1

ภาษาอังกฤษไม่ใช่ภาษาแม่ของฉัน โปรดแก้ตัวข้อผิดพลาดในการพิมพ์

ใช้การกำหนดค่าบรรทัดนี้:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
วางโครงการ CMakeLists.txt ใด ๆ ของคุณ
$ {PROJECT_SOURCE_DIR} นี้เป็นไดเรกทอรีแหล่งปัจจุบันของคุณที่วางโครงการ
และถ้าเดินทำไม $ {} EXECUTABLE_OUTPUT_PATH
ตรวจสอบไฟล์นี้CMakeCache.txtแล้วค้นหาคำสำคัญoutput path,
ตัวแปรทั้งหมดกำหนดที่นี่ก็จะให้คำอธิบายที่เต็มรูปแบบของโครงการทั้งหมด setting·



0

ไม่ว่าฉันจะกำหนดสิ่งนี้ใน CMakeLists.txt หลักหรือในแต่ละบุคคลมันก็ยังถือว่าฉันต้องการ libs และถังขยะทั้งหมดออกจากเส้นทางหลักซึ่งเป็นข้อสันนิษฐานที่มีประโยชน์น้อยที่สุดของทั้งหมด


0

หากต้องการเพิ่มลงในสิ่งนี้:

หากคุณใช้ CMAKE เพื่อสร้างโซลูชันVisual Studioและคุณต้องการให้Visual Studioส่งออกไฟล์ที่คอมไพล์ลงใน / bin คำตอบของ Peter ต้องได้รับการแก้ไขเล็กน้อย:

# 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 )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.