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

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

4
องค์กรโครงการ C ++ (พร้อม gtest, cmake และ doxygen)
ฉันยังใหม่กับการเขียนโปรแกรมโดยทั่วไปดังนั้นฉันจึงตัดสินใจว่าจะเริ่มต้นด้วยการสร้างคลาสเวกเตอร์อย่างง่ายใน C ++ อย่างไรก็ตามฉันต้องการสร้างนิสัยที่ดีตั้งแต่เริ่มต้นแทนที่จะพยายามแก้ไขขั้นตอนการทำงานของฉันในภายหลัง ขณะนี้ฉันมีเพียงสองไฟล์vector3.hppและvector3.cpp. โครงการนี้จะเริ่มเติบโตอย่างช้าๆ (ทำให้เป็นไลบรารีพีชคณิตเชิงเส้นทั่วไปมากขึ้น) เมื่อฉันคุ้นเคยกับทุกสิ่งมากขึ้นฉันจึงต้องการใช้เค้าโครงโครงการ "มาตรฐาน" เพื่อทำให้ชีวิตง่ายขึ้นในภายหลัง หลังจากมองไปรอบ ๆ ฉันได้พบสองวิธีในการจัดระเบียบไฟล์ hpp และ cpp วิธีแรก: project └── src ├── vector3.hpp └── vector3.cpp และสิ่งที่สอง: project ├── inc │ └── project │ └── vector3.hpp └── src └── vector3.cpp คุณจะแนะนำตัวไหนและเพราะอะไร ประการที่สองฉันต้องการใช้ Google C ++ Testing Framework สำหรับการทดสอบหน่วยของฉันเนื่องจากดูเหมือนว่าจะใช้งานง่าย คุณแนะนำให้รวมสิ่งนี้เข้ากับรหัสของฉันเช่นในinc/gtestหรือcontrib/gtestโฟลเดอร์หรือไม่ หากรวมกลุ่มคุณแนะนำให้ใช้fuse_gtest_files.pyสคริปต์เพื่อลดจำนวนหรือไฟล์หรือปล่อยให้เป็น หากไม่ได้รวมการพึ่งพานี้จะจัดการอย่างไร เมื่อพูดถึงการทดสอบการเขียนโดยทั่วไปมีการจัดระเบียบอย่างไร? …
123 c++  cmake  doxygen  googletest 

7
วิธีระบุเส้นทาง GCC ใหม่สำหรับ CMake
ฉัน OS เป็น CentOS ซึ่งมี GCC /usr/bin/gccเริ่มต้นในเส้นทาง แต่มันเก่าฉันต้องการ gcc เวอร์ชันใหม่ /usr/local/bin/gccดังนั้นผมจึงติดตั้งรุ่นใหม่ในเส้นทางใหม่ แต่เมื่อฉันเรียกใช้cmakeมันยังคงใช้เส้นทาง gcc ( /usr/bin/gcc) เวอร์ชันเก่า ฉันจะระบุ gcc ไปยังเส้นทางใหม่ ( /usr/local/bin/gcc) ได้อย่างไร ฉันได้พยายามที่จะเขียนทับ/usr/bin/gccด้วย/usr/local/bin/gccแต่มันไม่ทำงาน
122 gcc  cmake 

12
CMake ไม่พบไลบรารี OpenSSL
ฉันกำลังพยายามติดตั้งซอฟต์แวร์ซึ่งใช้ cmake เพื่อติดตั้งตัวเองเมื่อฉันให้ที่ commandlin cmake .. มันทำให้ฉันมีข้อผิดพลาดต่อไปนี้ในไฟล์นี้ CMakeLists.txt -------- บรรทัด ---> find_package ( ต้องการ OpenSSL): - cmake .. -- Could NOT find Git (missing: GIT_EXECUTABLE) ZLib include dirs: /usr/include ZLib libraries: /usr/lib/arm-linux-gnueabihf/libz.so Compiling with SSL support CMake Error at /usr/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (message): Could NOT find OpenSSL, try to set the path …
121 openssl  cmake 

3
สร้างเทียบกับสร้างรหัสตัวอย่าง?
ฉันสงสัยว่ามีโค้ดตัวอย่างสำหรับMakefiles ( make) และCMakeLists.txt( cmake) ที่ทั้งสองทำสิ่งเดียวกัน (ข้อแตกต่างเพียงอย่างเดียวคือรหัสที่เขียนขึ้นmakeและอีกอันในcmake) ฉันพยายามมองหา 'cmake vs make' แต่ไม่พบการเปรียบเทียบโค้ดใด ๆ การทำความเข้าใจความแตกต่างจะเป็นประโยชน์มากแม้ว่าจะเป็นเพียงกรณีธรรมดา ๆ ก็ตาม
120 makefile  cmake 

1
วิธีสำนวนใน CMAKE ในการเพิ่มตัวเลือกคอมไพเลอร์ -fPIC คืออะไร?
ฉันเจออย่างน้อย 3 วิธีในการทำสิ่งนี้และฉันสงสัยว่าวิธีใดเป็นสำนวน สิ่งนี้จำเป็นต้องดำเนินการในระดับสากลกับไลบรารีแบบคงที่ ฉันแปลกใจที่ตัวสร้าง Makefile ใน CMake ไม่เพิ่มสิ่งนี้ลงในไลบรารีแบบคงที่โดยอัตโนมัติ (เว้นแต่ฉันจะพลาดอะไรไป?) target_compile_options(myLib PRIVATE -fPIC) add_compile_options(-fPIC) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic") ฉันเชื่อว่าอาจมีรูปแบบอื่น ๆ (โปรดแก้ไขคำถามของฉันหากคุณพบ) หากคุณทราบคำตอบสำหรับคำถามนี้คุณทราบหรือไม่ว่ามีวิธีใดที่จะทำให้โครงการ CMake ของบุคคลที่สามถูกคอมไพล์ด้วยแฟล็กนี้โดยไม่ต้องแก้ไขไฟล์ CMakeLists.txt ฉันทำงานข้ามไลบรารีแบบคงที่โดยไม่มีแฟล็กนั้น ทำให้เกิดปัญหาเมื่อรวบรวมไลบรารีแบบคงที่ลงในไลบรารีไดนามิก คุณได้รับ: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
120 c++  c  cmake 

27
CMake ไม่พบคอมไพเลอร์ Visual C ++
หลังจากติดตั้ง Visual Studio 2015 และเรียกใช้ CMake ในโปรเจ็กต์ก่อนหน้าข้อผิดพลาด CMake ที่ระบุว่าไม่พบคอมไพเลอร์ C The C compiler identification is unknown The CXX compiler identification is unknown CMake Error at CMakeLists.txt:4 (PROJECT): No CMAKE_C_COMPILER could be found. CMake Error at CMakeLists.txt:4 (PROJECT): No CMAKE_CXX_COMPILER could be found. ฉันไปค้นหาcl.exeในโฟลเดอร์ Visual Studio C:\Program Files\Microsoft Visual Studio 14.0แล้วไม่พบ …

3
ตัวอย่าง CMake ที่เรียบง่าย แต่สมบูรณ์ที่สุด
ฉันรู้สึกสับสนโดยสิ้นเชิงกับวิธีการทำงานของ CMake ทุกครั้งที่ฉันคิดว่าฉันเริ่มเข้าใจวิธีการเขียน CMake มากขึ้นมันจะหายไปในตัวอย่างถัดไปที่ฉันอ่าน สิ่งที่ฉันอยากรู้คือฉันควรจัดโครงสร้างโครงการของฉันอย่างไรเพื่อให้ CMake ของฉันต้องการการบำรุงรักษาน้อยที่สุดในอนาคต ตัวอย่างเช่นฉันไม่ต้องการอัปเดต CMakeList.txt เมื่อฉันเพิ่มโฟลเดอร์ใหม่ในโครงสร้าง src ซึ่งทำงานเหมือนกับโฟลเดอร์ src อื่น ๆ ทั้งหมด นี่เป็นวิธีที่ฉันจินตนาการถึงโครงสร้างโครงการของฉัน แต่โปรดเป็นเพียงตัวอย่างเท่านั้น หากวิธีที่แนะนำแตกต่างกันโปรดบอกฉันและบอกฉันว่าต้องทำอย่างไร myProject src/ module1/ module1.h module1.cpp module2/ [...] main.cpp test/ test1.cpp resources/ file.png bin [execute cmake ..] อย่างไรก็ตามสิ่งสำคัญคือโปรแกรมของฉันต้องรู้ว่าทรัพยากรอยู่ที่ไหน ฉันต้องการทราบวิธีการจัดการทรัพยากรที่แนะนำ ฉันไม่ต้องการเข้าถึงทรัพยากรของฉันด้วย "../resources/file.png"
117 c++  cmake  project-setup 

6
จะตั้งระดับการเตือนใน CMake ได้อย่างไร?
วิธีการตั้งค่าระดับการเตือนสำหรับโครงการ (ไม่ใช่วิธีการแก้ปัญหาทั้งหมด) โดยใช้CMake ? ควรจะทำงานในVisual StudioและGCC ฉันพบตัวเลือกต่างๆ แต่ส่วนใหญ่ดูเหมือนจะไม่ได้ผลหรือไม่สอดคล้องกับเอกสาร

5
ไดเร็กทอรีเอาต์พุต / สร้าง CMake
ฉันค่อนข้างใหม่สำหรับ CMake และอ่านบทแนะนำเกี่ยวกับวิธีการใช้งานและเขียนสคริปต์ CMake ที่ซับซ้อน 50 บรรทัดเพื่อสร้างโปรแกรมสำหรับคอมไพเลอร์ 3 ตัว นี่อาจเป็นการสรุปความรู้ทั้งหมดของฉันใน CMake ตอนนี้ปัญหาของฉันคือฉันมีซอร์สโค้ดซึ่งมีโฟลเดอร์ที่ฉันไม่ต้องการสัมผัส / ยุ่งกับเมื่อฉันสร้างโปรแกรม ฉันต้องการให้ CMake และmakeเอาท์พุตไฟล์และโฟลเดอร์ทั้งหมดเข้ามา../Compile/ดังนั้นฉันจึงเปลี่ยนตัวแปรสองสามตัวในสคริปต์ CMake ของฉันสำหรับสิ่งนั้นและมันก็ใช้ได้ในบางครั้งเมื่อฉันทำสิ่งนี้บนแล็ปท็อปของฉัน: Compile$ cmake ../src Compile$ make โดยที่ฉันมีผลลัพธ์ที่สะอาดในโฟลเดอร์ที่ฉันอยู่ตอนนี้ซึ่งเป็นสิ่งที่ฉันกำลังมองหา ตอนนี้ฉันย้ายไปที่คอมพิวเตอร์เครื่องอื่นและคอมไพล์ CMake 2.8.11.2 ใหม่และฉันเกือบจะกลับไปที่สี่เหลี่ยมจัตุรัส! มันมักจะรวบรวมสิ่งนั้นไว้ในsrcโฟลเดอร์ที่ฉันCMakeLists.txtอยู่ ส่วนที่ฉันเลือกไดเร็กทอรีในสคริปต์ CMake ของฉันคือ: set(dir ${CMAKE_CURRENT_SOURCE_DIR}/../Compile/) set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE) set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY …
116 c++  build  makefile  cmake  output 

8
คำแนะนำเฉพาะระบบปฏิบัติการใน CMAKE: ทำอย่างไร?
ฉันเป็นมือใหม่กับ CMAKE ด้านล่างนี้เป็นไฟล์ cmake แบบธรรมดาซึ่งทำงานได้ดีในหน้าต่างสภาพแวดล้อม mingw ปัญหาชัดเจนกับtarget_link_libraries()ฟังก์ชันของ CMAKE ที่ฉันเชื่อมโยง libwsock32.a ใน windows สิ่งนี้ใช้งานได้และฉันได้รับผลลัพธ์ อย่างไรก็ตามตามที่คาดไว้ใน Linux /usr/bin/ldจะมองหา-lwsock32สิ่งที่ไม่มีใน Linux OS ปัญหาของฉันคือ: ฉันจะสั่งให้ CMAKE หลีกเลี่ยงการเชื่อมโยงไลบรารี wsock32 ใน Linux OS ได้อย่างไร ??? ความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมาก ไฟล์ Simple CMake ของฉัน: PROJECT(biourl) set (${PROJECT_NAME}_headers ./BioSocketAddress.h ./BioSocketBase.h ./BioSocketBuffer.h ./BioSocketCommon.h ./BioSocketListener.h ./BioSocketPrivate.h ./BioSocketStream.h ./BioUrl.h BioDatabase.h ) set (${PROJECT_NAME}_sources …
116 c++  linux  cmake  mingw  portability 

5
CMake: วิธีสร้างโครงการภายนอกและรวมเป้าหมายไว้ด้วย
ฉันมีโครงการ A ที่ส่งออกไลบรารีแบบคงที่เป็นเป้าหมาย: install(TARGETS alib DESTINATION lib EXPORT project_a-targets) install(EXPORT project_a-targets DESTINATION lib/alib) ตอนนี้ฉันต้องการใช้โครงการ A เป็นโครงการภายนอกจากโครงการ B และรวมเป้าหมายที่สร้างไว้: ExternalProject_Add(project_a URL ...project_a.tar.gz PREFIX ${CMAKE_CURRENT_BINARY_DIR}/project_a CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> ) include(${CMAKE_CURRENT_BINARY_DIR}/lib/project_a/project_a-targets.cmake) ปัญหาคือยังไม่มีไฟล์รวมเมื่อเรียกใช้ CMakeLists ของโครงการ B มีวิธีทำให้การรวมขึ้นอยู่กับโครงการภายนอกที่สร้างขึ้นหรือไม่? อัปเดต : ฉันเขียนบทแนะนำ CMakeสั้น ๆตามตัวอย่างตามนี้และปัญหาทั่วไปอื่น ๆ ที่ฉันพบ

2
การเพิ่มตัวเลือกบรรทัดคำสั่งใน CMake
ฉันกำลังสร้างห้องสมุดขนาดใหญ่โดยใช้ CMake และฉันต้องการให้ผู้ใช้สามารถเลือกเปิด / ปิดบางส่วนของกระบวนการสร้างของฉันได้ ฉันจะเพิ่มตัวเลือกบรรทัดคำสั่งให้กับบิลด์ CMake ของฉันได้อย่างไรเพื่อให้ผู้ใช้พิมพ์บางอย่างเช่นcmake --build-partone --nobuild-parttwo --dothis=true --dothat=false ..? เห็นได้ชัดว่าคีย์เวิร์ด OPTION จะสร้างตัวแปรที่สามารถตั้งค่าได้จาก CMake GUI แต่ฉันไม่สามารถหาวิธีทำได้จากบรรทัดคำสั่ง

3
แทนที่แฟล็กคอมไพล์สำหรับไฟล์เดี่ยว
ฉันต้องการใช้ชุดค่าสถานะส่วนกลางสำหรับการรวบรวมโปรเจ็กต์ซึ่งหมายความว่าที่ไฟล์ CMakeLists.txt ระดับบนสุดของฉันฉันได้ระบุ: ADD_DEFINITIONS ( -Wall -Weffc++ -pedantic -std=c++0x ) อย่างไรก็ตามสำหรับไฟล์เฉพาะ (สมมติว่า "foo.cpp") ในไดเร็กทอรีย่อยฉันต้องการเปลี่ยนแฟล็กคอมไพล์ไม่ให้ใช้ -Weffc ++ (รวมไลบรารีเชิงพาณิชย์ที่ฉันไม่สามารถเปลี่ยนแปลงได้) เพื่อลดความซับซ้อนของสถานการณ์ให้ใช้ -Wall เท่านั้นฉันพยายาม: SET_SOURCE_FILES_PROPERTIES( foo.cpp PROPERTIES COMPILE_FLAGS -Wall ) ADD_EXECUTABLE( foo foo.cpp ) ซึ่งไม่ได้ผล ฉันยังพยายาม SET_PROPERTY( SOURCE foo.cpp PROPERTY COMPILE_FLAGS -Wall ) ADD_EXECUTABLE( foo foo.cpp ) และ ADD_EXECUTABLE( foo foo.cpp ) SET_TARGET_PROPERTIES( foo …

8
คัดลอกไฟล์จากไดเร็กทอรีต้นทางไปยังไดเร็กทอรีไบนารีโดยใช้ CMake
ฉันกำลังพยายามสร้างโปรเจ็กต์ง่ายๆบน CLion ใช้ CMake (ฉันใหม่ที่นี่) เพื่อสร้าง Makefiles เพื่อสร้างโครงการ (หรือบางประเภท) สิ่งที่ฉันต้องทำคือถ่ายโอนไฟล์ที่ไม่ใช่โปรเจ็กต์ (ไฟล์ทรัพยากรบางประเภท) ไปยังไดเร็กทอรีไบนารีทุกครั้งเมื่อฉันเรียกใช้โค้ดของฉัน ไฟล์นั้นมีข้อมูลการทดสอบและแอปพลิเคชันเปิดขึ้นเพื่ออ่าน ฉันลองทำหลายวิธี: ผ่าน file(COPY ... file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/input.txt ดูดี แต่ใช้งานได้เพียงครั้งเดียวและไม่คัดลอกไฟล์หลังจากการรันครั้งต่อไป ผ่าน add_custom_command OUTPUT รุ่น add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/input.txt COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.txt ${CMAKE_CURRENT_BINARY_DIR}/input.txt) TARGET รุ่น add_custom_target(foo) add_custom_command( TARGET foo COMMAND ${CMAKE_COMMAND} copy ${CMAKE_CURRENT_BINARY_DIR}/test/input.txt ${CMAKE_SOURCE_DIR}) แต่ไม่มีใครใช้งานได้ ผมทำอะไรผิดหรือเปล่า?
110 cmake 


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