2012-12-29 8 views
40

Tôi có một dự án nhỏ với một Makefile mà tôi đang cố gắng chuyển đổi sang CMake, chủ yếu chỉ để có được kinh nghiệm với CMake. Với các mục đích của ví dụ này, dự án có chứa một tệp nguồn (C++, mặc dù tôi không nghĩ ngôn ngữ đó có liên quan đặc biệt) và một tệp thư viện tĩnh mà tôi đã sao chép từ nơi khác. Giả sử vì lợi ích của đối số rằng mã nguồn tới thư viện không có sẵn; Tôi chỉ có tệp .a và tiêu đề tương ứng.Làm cách nào để yêu cầu CMake liên kết trong một thư viện tĩnh trong thư mục nguồn?

Makefile handmade My chứa build này quy tắc:

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

mà hoạt động tốt. Làm thế nào để tôi nói với CMake để tái sản xuất này? Không phải chính xác là makefile chính xác này, tất nhiên, nhưng cái gì đó bao gồm một lệnh liên kết tương đương. Tôi đã thử những cách rõ ràng nhưng ngây thơ, như

add_executable(main main.cpp libbingitup.a) 

hoặc

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

cũng như những thứ khác nhau với link_directories(.) hoặc add_library(bingitup STATIC IMPORTED) vv nhưng không có gì cho đến nay mà kết quả trong một mối liên hệ thành công. Tôi nên làm gì đây?


Version chi tiết: CMake 2.8.7 trên Linux (Kubuntu 12.04) với GCC 4.6.3

Trả lời

60

CMake ủng hộ việc mổ đi qua đường dẫn đầy đủ để liên kết các thư viện, vì vậy giả sử libbingitup.a là trong ${CMAKE_SOURCE_DIR}, làm sau nên thành công:

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

Tuyệt vời, mà làm việc, cảm ơn! Có vẻ như một chút hackish phải đặt vào con đường đầy đủ một cách rõ ràng ở đây, nhưng tôi đoán đó chỉ là cách thức của CMake ... –

+2

Tôi đồng ý rằng có vẻ như quá mức ở đây, nhưng chỉ định rõ ràng đường dẫn đầy đủ trả cổ tức nếu bạn có nhiều phiên bản khác nhau của cùng một cài đặt lib. – Fraser

+0

Tuyệt vời, như thường lệ! Trong trường hợp của tôi, giải quyết một vấn đề của thư viện phụ thuộc vào một thư viện động được xây dựng khác mà là tùy thuộc vào một thư viện tĩnh: các thư viện phụ thuộc cũng đang cố gắng liên kết đến thư viện tĩnh này. – Antonio

10

tôi thấy hữu ích ...

http://www.cmake.org/pipermail/cmake/2011-June/045222.html

này

Từ tấm gương của họ:

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) 
+0

hoạt động hoàn hảo. cảm ơn –

7

Nếu bạn không muốn bao gồm đường dẫn đầy đủ, bạn có thể làm

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

bingitup là tên mà bạn muốn đưa ra một mục tiêu nếu bạn tạo thư viện tĩnh trong một dự án CMake:

add_library(bingitup STATIC bingitup.cpp) 

CMake tự động thêm lib.a ở mặt trước trên Linux và .lib ở cuối trên Windows.

Nếu thư viện là bên ngoài, bạn có thể muốn thêm đường dẫn đến thư viện sử dụng

link_directories(/path/to/libraries/)