ฉันจะบอกให้ CMake เชื่อมโยงในไลบรารีแบบคงที่ในไดเร็กทอรีต้นทางได้อย่างไร


96

ฉันมีโปรเจ็กต์เล็ก ๆ ที่มี Makefile ซึ่งฉันพยายามจะแปลงเป็น CMake ส่วนใหญ่เพียงเพื่อรับประสบการณ์กับ CMake สำหรับวัตถุประสงค์ของตัวอย่างนี้โครงการมีไฟล์ต้นฉบับ (C ++ แม้ว่าฉันไม่คิดว่าภาษามีความเกี่ยวข้องเป็นพิเศษ) และไฟล์ไลบรารีแบบคงที่ซึ่งฉันได้คัดลอกมาจากที่อื่น สมมติเพื่อประโยชน์ในการโต้แย้งว่าซอร์สโค้ดไปยังไลบรารีไม่พร้อมใช้งาน ฉันมีเพียงไฟล์. a และส่วนหัวที่เกี่ยวข้อง

Makefile ทำด้วยมือของฉันมีกฎการสร้างนี้:

main: main.o libbingitup.a
    g++ -o main main.o libbingitup.a

ซึ่งใช้งานได้ดี ฉันจะบอกให้ CMake สร้างสิ่งนี้ได้อย่างไร ไม่ใช่ makefile ที่แน่นอน แต่เป็นสิ่งที่มีคำสั่งเชื่อมโยงที่เทียบเท่า ฉันได้ลองวิธีที่ชัดเจน แต่ไร้เดียงสาเช่น

add_executable(main main.cpp libbingitup.a)

หรือ

add_executable(main main.cpp)
target_link_libraries(main libbingitup.a)

ตลอดจนสิ่งต่างๆที่มีlink_directories(.)หรือadd_library(bingitup STATIC IMPORTED)อื่น ๆ แต่ยังไม่มีอะไรที่ส่งผลให้การเชื่อมโยงประสบความสำเร็จ ฉันควรทำอย่างไร


รายละเอียดเวอร์ชัน: CMake 2.8.7 บน Linux (Kubuntu 12.04) พร้อม GCC 4.6.3

คำตอบ:


121

CMake ชอบส่งเส้นทางแบบเต็มเพื่อเชื่อมโยงไลบรารีดังนั้นสมมติว่า libbingitup.a อยู่ใน${CMAKE_SOURCE_DIR}การทำสิ่งต่อไปนี้ควรประสบความสำเร็จ:

add_executable(main main.cpp)
target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a)

2
เยี่ยมมากที่ได้ผลขอบคุณ! ดูเหมือนจะเป็นการแฮ็กเล็กน้อยที่ต้องใส่เส้นทางเต็มอย่างชัดเจนที่นี่ แต่ฉันคิดว่านั่นเป็นเพียงวิธี CMake เท่านั้น ...
David Z

4
ฉันยอมรับว่าดูเหมือนว่า overkill ที่นี่ แต่การระบุเส้นทางแบบเต็มจะจ่ายเงินปันผลอย่างชัดเจนหากคุณติดตั้ง lib เดียวกันหลายเวอร์ชัน
Fraser

1
น่าทึ่งเหมือนเคย! ในกรณีของฉันแก้ไขปัญหาของไลบรารีโดยขึ้นอยู่กับไลบรารีไดนามิกอื่นที่สร้างขึ้นซึ่งขึ้นอยู่กับไลบรารีแบบคงที่: ไลบรารีที่ขึ้นอยู่ได้พยายามเชื่อมโยงไปยังไลบรารีแบบคงที่นี้ด้วย
อันโตนิโอ

1
หลักรู้อย่างไรเกี่ยวกับไดเรกทอรีรวม?
ManuelSchneid3r

3
คุณจำเป็นต้องใช้target_include_directoriesหรือinclude_directories(วิธีเดิมเป็นวิธีที่ต้องการเนื่องจากมีความเฉพาะเจาะจงมากขึ้น)
Fraser

31

หากคุณไม่ต้องการรวมเส้นทางแบบเต็มคุณสามารถทำได้

add_executable(main main.cpp)
target_link_libraries(main bingitup)

bingitup เป็นชื่อเดียวกับที่คุณกำหนดเป้าหมายหากคุณสร้างไลบรารีแบบคงที่ในโครงการ CMake:

add_library(bingitup STATIC bingitup.cpp)

CMake จะเพิ่มlibส่วนหน้าและ.aส่วนท้ายบน Linux โดยอัตโนมัติและ.libต่อท้ายบน Windows

หากไลบรารีอยู่ภายนอกคุณอาจต้องการเพิ่มพา ธ ไปยังไลบรารีโดยใช้

link_directories(/path/to/libraries/)

1
และหากมีไฟล์. a และ. so ที่มีชื่อเดียวกันวิธีที่คุณระบุว่าต้องการเชื่อมโยงกับ. a หรือ. ดังนั้นในกรณีนี้?
George

1
@ จอร์จ: ไม่ไหวแล้ว หากคุณมีทั้งสองประเภทให้ใส่ชื่อเต็มของไฟล์ที่คุณต้องการเชื่อมโยง
Cris Luengo

21

ฉันพบว่าสิ่งนี้มีประโยชน์ ...

http://www.cmake.org/pipermail/cmake/2011- มิถุนายน/045222.html

จากตัวอย่าง:

ADD_LIBRARY(boost_unit_test_framework STATIC IMPORTED)
SET_TARGET_PROPERTIES(boost_unit_test_framework PROPERTIES IMPORTED_LOCATION /usr/lib/libboost_unit_test_framework.a)
TARGET_LINK_LIBRARIES(mytarget A boost_unit_test_framework C)

3
แล้ว INCLUDE_DIRECTORIES ล่ะ
kyb

1
สิ่งนี้ใช้ได้เฉพาะในกรณีที่ไลบรารีเป็นส่วนหนึ่งของการสร้าง cmake แต่สิ่งต่างประเทศใช้ไม่ได้
eigenfield

คำถามระบุว่า "โครงการนี้มีไฟล์ต้นฉบับ (C ++ แม้ว่าฉันจะไม่คิดว่าภาษานี้มีความเกี่ยวข้องเป็นพิเศษ) และไฟล์ไลบรารีแบบคงที่ซึ่งฉันได้คัดลอกมาจากที่อื่น"
สตู
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.