คำถามติดแท็ก cmake

CMake เป็นเครื่องกำเนิดระบบสร้างข้ามแพลตฟอร์ม มันสร้างไฟล์สำหรับระบบการสร้างเช่น makefiles ดั้งเดิม, นินจาสร้างและไฟล์โครงการสำหรับสภาพแวดล้อมการพัฒนาแบบบูรณาการหลาย

3
วิธีตั้งค่าตัวเลือก CMake () ที่บรรทัดคำสั่ง
ฉันสร้าง CMakeLists.txt ที่มีสิ่งต่อไปนี้ project(P4V) cmake_minimum_required(VERSION 2.6) option(BUILD_STATIC_LIBS "Build the static library" ON) option(BUILD_SHARED_LIBS "Build the shared library" ON) option(BUILD_TESTS "Build test programs" OFF) include_directories(${CMAKE_SOURCE_DIR}/include) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) set(CMAKE_BUILD_TYPE Release) add_subdirectory(src) if(BUILD_TESTS) add_subdirectory(tests) endif(BUILD_TESTS) โดยค่าเริ่มต้น BUILD_TESTS ปิดอยู่ฉันจะเปิดโดยไม่ใช้ CMake GUI ได้อย่างไร แต่ใช้คำสั่ง cmake เอง ฉันลองทำสิ่งต่อไปนี้แล้ว แต่ไม่ได้ผล cmake .. -G …

8
วิธีใช้ CCache กับ CMake
ฉันต้องการทำสิ่งต่อไปนี้: หากมี CCache อยู่ใน PATH ให้ใช้ "ccache g ++" สำหรับการคอมไพล์มิฉะนั้นให้ใช้ g ++ ฉันพยายามเขียนสคริปต์ my-cmake ขนาดเล็กที่มีไฟล์ CC="ccache gcc" CXX="ccache g++" cmake $* แต่ดูเหมือนจะไม่ทำงาน (การรัน make ยังไม่ใช้ ccache ฉันตรวจสอบสิ่งนี้โดยใช้ CMAKE_VERBOSE_MAKEFILE บน) อัปเดต: ตามลิงค์นี้ฉันพยายามเปลี่ยนสคริปต์ของฉันเป็น cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $* แต่ cmake บ่นว่าการทดสอบล้มเหลวในการใช้ ccache คอมไพเลอร์ (ซึ่งสามารถคาดหวังได้)
92 c++  unix  cmake  ccache 

10
CMake & CTest: ทำการทดสอบไม่ได้สร้างการทดสอบ
ฉันกำลังลอง CTest ใน CMake เพื่อทำการทดสอบบางอย่างโดยอัตโนมัติโดยใช้make testเป้าหมาย ปัญหาคือ CMake ไม่ "เข้าใจ" ว่าการทดสอบที่ฉันยินดีจะเรียกใช้จะต้องถูกสร้างขึ้นเนื่องจากเป็นส่วนหนึ่งของโครงการ ดังนั้นฉันกำลังมองหาวิธีระบุการอ้างอิงนี้อย่างชัดเจน

6
ฟังก์ชันเทียบกับมาโครใน CMake
เอกสารอย่างเป็นทางการของ CMake 2.8.12กล่าวเกี่ยวกับmacro เมื่อเรียกใช้คำสั่งที่บันทึกไว้ในมาโครจะถูกแก้ไขก่อนโดยแทนที่พารามิเตอร์แบบเป็นทางการ ($ {arg1}) ด้วยอาร์กิวเมนต์ที่ส่งผ่านจากนั้นจึงเรียกใช้เป็นคำสั่งปกติ และเกี่ยวกับ function เมื่อเรียกใช้คำสั่งที่บันทึกไว้ในฟังก์ชันจะถูกแก้ไขก่อนโดยแทนที่พารามิเตอร์ที่เป็นทางการ ($ {arg1}) ด้วยอาร์กิวเมนต์ที่ส่งผ่านจากนั้นจึงเรียกใช้เป็นคำสั่งปกติ เห็นได้ชัดว่าสองคำพูดเกือบจะเหมือนกัน แต่ทำให้ฉันสับสน แทนที่พารามิเตอร์ในตอนแรกเมื่อเรียกใช้ฟังก์ชันเหมือนกับมาโครหรือไม่
90 cmake 

10
CMake ไม่สามารถระบุภาษาตัวเชื่อมโยงด้วย C ++
ฉันพยายามเรียกใช้โปรแกรม cmake hello world บน Windows 7 x64 กับทั้ง Visual Studio 2010 และ Cygwin แต่ดูเหมือนจะไม่สามารถใช้งานได้ โครงสร้างไดเร็กทอรีของฉันมีดังนี้: HelloWorld -- CMakeLists.txt -- src/ -- -- CMakeLists.txt -- -- main.cpp -- build/ ฉันทำcd buildตามด้วย a cmake ..และได้รับข้อผิดพลาดที่ระบุว่า CMake Error: CMake can not determine linker language for target:helloworld CMake Error: Cannot determine link language …
90 c++  c  cmake 

3
ฉันจะแยกไฟล์เดียวออกจากรูปแบบไฟล์ cmake (GLOB …) `ได้อย่างไร
ของฉันCMakeLists.txtมีบรรทัดนี้: file(GLOB lib_srcs Half/half.cpp Iex/*.cpp IlmThread/*.cpp Imath/*.cpp IlmImf/*.cpp) และIlmImfโฟลเดอร์นั้นมีb44ExpLogTable.cppซึ่งฉันต้องแยกออกจากบิลด์ จะบรรลุได้อย่างไร?
90 cmake 

4
ตั้งค่าตัวเลือก CFLAGS และ CXXFLAGS โดยใช้ CMake
ฉันแค่ต้องการดีบักโค้ดบางตัวที่ทำงานบน Linux และฉันต้องการ debug build ( -O0 -ggdb) ดังนั้นฉันจึงเพิ่มสิ่งเหล่านี้ในCMakeLists.txt: set(CMAKE_BUILD_TYPE DEBUG) set(CMAKE_C_FLAGS "-O0 -ggdb") set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb") set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb") set(CMAKE_CXX_FLAGS "-O0 -ggdb") set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb") set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb") เมื่อฉันพยายามรวบรวมฉันเปิดใช้ verbose make VERBOSE=1 และฉันสังเกตเห็นผลลัพธ์เช่นนี้ ... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-exceptions …
90 cmake  cflags 

13
Cmake ไม่พบ Boost
ฉันกำลังพยายามกำหนดค่าโปรเจ็กต์โดยใช้ CMake แต่ไม่พบไลบรารี Boost แม้ว่าจะอยู่ในโฟลเดอร์ที่ระบุก็ตาม ฉันได้ระบุBoost_INCLUDE_DIR, Boost_LIBRARYDIRและBOOST_ROOTแต่ฉันยังคงได้รับข้อผิดพลาดบอกว่า CMake ไม่สามารถที่จะหาเพิ่ม อะไรคือสาเหตุของข้อผิดพลาดดังกล่าว?
89 boost  cmake 

1
กำหนดค่า CMake ใน windows เพื่อใช้เสียงดังกราวจากบรรทัดคำสั่งเพื่อรับการสนับสนุน OpenMP ที่ทันสมัย
ฉันมีโครงการทดสอบขนาดเล็กที่ใช้ OpenMP สำหรับการขนาน เป้าหมายของฉันคือการรวบรวมมันเพื่อผลิต.dllและ.libสำหรับห้องสมุด (เพราะโครงการจริงของฉันเชื่อมโยงไปยังห้องสมุดภายนอกที่กระจายโดยใช้ประเภทเหล่านี้) ด้วยการสนับสนุน OpenMP 4.5 หรือใหม่กว่าและทำจากบรรทัดคำสั่งเพื่อให้สามารถทำได้บนนักเทียบท่าสำหรับ การทดสอบและตรวจสอบ (ส่วนนักเทียบท่าอยู่นอกขอบเขตของคำถามนี้มันเป็นเพียงสำหรับการอ้างอิงในสาเหตุที่ฉันต้องการให้มันทำงานจากบรรทัดคำสั่ง) ฉันสามารถรวบรวมโครงการนี้ด้วยคอมไพเลอร์ต่าง ๆ ที่ฉันไม่มีความสุข: MSVC: mkdir build-msvcแล้วcmake ..(จากโฟลเดอร์ที่สร้างขึ้นใหม่) cmake --build . --config Releaseและในที่สุด สิ่งนี้รวบรวมได้ดี แต่รองรับ OpenMP 2.0 เท่านั้นดังนั้นจึงไม่ใช่ตัวเลือกที่ดีสำหรับโครงการจริงของฉัน Intel Parallel Studio: mkdir build-intelแล้วcmake .. -T "Intel C++ Compiler 19.0"(จากโฟลเดอร์ที่สร้างขึ้นใหม่) cmake --build . --config Releaseและในที่สุด สิ่งนี้สนับสนุน OpenMP 5.0 แต่ลิขสิทธิ์ของฉันค่อนข้างแพงสำหรับฉัน MinGW x …

1
CMake: จะบอกได้อย่างไรว่าการพึ่งพาสกรรมกริยามาจากไหน?
ฉันอยู่ในกระบวนการเขียนการตั้งค่า CMake ดั้งเดิมเพื่อใช้คุณสมบัติที่ทันสมัยเช่นการเผยแพร่อัตโนมัติ (เช่นการใช้สิ่งต่าง ๆtarget_include_directories(<target> PUBLIC <dir>)แทนinclude_directories(<dir>)) ปัจจุบันเราจัดการข้อมูลการอ้างอิงโครงการทั้งหมดด้วยตนเองโดยการตั้งค่าคุณสมบัติของไดเรกทอรีทั่วโลก ในการทดสอบของฉันฉันได้พบตัวอย่างเล็ก ๆ น้อย ๆ ที่เป้าหมายในการสร้างใหม่จะเชื่อมโยงไปยังห้องสมุดที่การสร้างเก่าจะไม่ ฉันไม่ได้เชื่อมโยงกับมันอย่างชัดเจนดังนั้นฉันจึงรู้ว่าสิ่งนี้มาจากการอ้างอิงของเป้าหมาย แต่เพื่อที่จะค้นหาว่าฉันควรจะดูว่าโครงการใดที่ฉันต้องทำซ้ำเพื่อCMakeLists.txtติดตามลำดับการพึ่งพาจนกระทั่งฉันพบ อันที่ดึงเข้าไปในห้องสมุดที่มีปัญหา เรามีห้องสมุดหลายสิบแห่งดังนั้นนี่จึงไม่ใช่กระบวนการที่ไม่สำคัญ CMake ให้วิธีการใด ๆ ในการมองเห็นสำหรับแต่ละเป้าหมายการเพิ่มการอ้างอิงของมันอย่างชัดเจนและการแพร่กระจายใดผ่านการพึ่งพาสกรรมกริยาหรือไม่ ดูเหมือนว่า--graphvizเอาต์พุตจะแสดงความแตกต่างนี้ดังนั้น CMake จึงรู้บริบทภายในอย่างชัดเจน อย่างไรก็ตามฉันต้องการเขียนtreeสคริปต์เหมือนเพื่อแสดงข้อมูลการพึ่งพาในบรรทัดคำสั่งและการแยกวิเคราะห์ไฟล์ Graphviz ดูเหมือนว่าทั้งฝันร้ายและแฮ็ค เท่าที่ฉันสามารถบอกได้cmake-file-apiจะไม่รวมข้อมูลนี้ ฉันคิดว่าcodemodel/target/dependenciesสนามอาจใช้งานได้ แต่มันแสดงการพึ่งพาทั้งในระดับท้องถิ่นและสกรรมกริยารวมกัน และbacktraceเขตข้อมูลของการอ้างอิงแต่ละครั้งจะผูกกลับไปที่add_executable/ การadd_libraryเรียกสำหรับเป้าหมายปัจจุบันเท่านั้น
10 cmake 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.