2013-06-20 36 views
7

Tôi đã tìm kiếm trên internet nhưng tôi không thể tìm thấy bất cứ điều gì mà sẽ trả lời câu hỏi của tôi (hoặc tôi không biết những gì để tìm kiếm).Làm thế nào để sử dụng DLL bên ngoài trong dự án CMake

Dù sao đây là vấn đề của tôi: Tôi muốn sử dụng thư viện thứ 3 (các tệp .dll) trong dự án CMake của mình. Thư viện (https://github.com/pitzer/SiftGPU) mà tôi muốn bao gồm là mã nguồn mở và cũng có sẵn trong nhị phân mà tôi muốn sử dụng và cũng sử dụng CMake làm công cụ xây dựng nếu có liên quan.

Tôi hy vọng tôi đã đủ rõ ràng.

Trả lời

9

Trước tiên, hãy chỉnh sửa CMakeLists.txt của bạn để bao gồm thư viện của bên thứ ba. Bạn sẽ cần hai điều: đường dẫn đến tệp tiêu đề và tệp thư viện để liên kết tới. Ví dụ:

# searching for include directory 
find_path(SIFTGPU_INCLUDE_DIR siftgpu.h) 

# searching for library file 
find_library(SIFTGPU_LIBRARY siftgpu) 

if (SIFTGPU_INCLUDE_DIR AND SIFTGPU_LIBRARY) 
    # you may need that if further action in your CMakeLists.txt depends 
    # on detecting your library 
    set(SIFTGPU_FOUND TRUE) 

    # you may need that if you want to conditionally compile some parts 
    # of your code depending on library availability 
    add_definitions(-DHAVE_LIBSIFTGPU=1) 

    # those two, you really need 
    include_directories(${SIFTGPU_INCLUDE_DIR}) 
    set(YOUR_LIBRARIES ${YOUR_LIBRARIES} ${SIFTGPU_LIBRARY}) 
endif() 

Tiếp theo, bạn có thể làm tương tự cho các thư viện khác và khi mỗi thư viện được phát hiện, liên kết đến các mục tiêu:

target_link_libraries(yourtarget ${YOUR_LIBRARIES}) 

Sau đó, bạn có thể cấu hình dự án của bạn với CMake, nhưng như nó không có bất kỳ cách kỳ diệu để tìm thư viện cài đặt của bạn, nó sẽ không tìm thấy bất cứ điều gì, nhưng nó sẽ tạo ra hai biến bộ nhớ cache: SIFTGPU_INCLUDE_DIRSIFTGPU_LIBRARY.

Sử dụng giao diện đồ họa CMake để có SIFTGPU_INCLUDE_DIR trỏ đến thư mục chứa tệp tiêu đề và SIFTGPU_LIBRARY vào tệp .lib của thư viện bên thứ ba của bạn.

Lặp lại cho mọi thư viện của bên thứ ba, định cấu hình lại và biên dịch.

+2

Làm thế nào để thông báo cho cmake biết tệp .dll nằm ở đâu? Tôi chỉ thấy liên kết tĩnh đến một thư viện lib và cung cấp một gợi ý cho vị trí tệp tiêu đề. – EbbnFlow

+3

Cmake không cần biết tệp dll ở đâu. Những tập tin này chỉ cần thiết khi chạy nhị phân không khi biên dịch nó. – Guillaume

Các vấn đề liên quan