2015-09-27 185 views
2

我需要鏈接第三方預構建的共享庫。在Windows上,這意味着鏈接Third_party.lib,並在Linux/Android上,這意味着鏈接libThird_party.so。因此,在跨platformness的興趣,我試着寫爲:Cmake庫前綴/後綴

${CMAKE_IMPORT_LIBRARY_PREFIX}Third_party${CMAKE_IMPORT_LIBRARY_SUFFIX} 

哪個Windows上工作正常,但在Linux/Android的,這些變量都是空白。我知道Linux/Android沒有導入庫,但是這些變量是空白的,實際上是一個很大的麻煩。並且將變量更改爲CMAKE_SHARED_LIBRARY_...也不起作用,因爲即使Linux/Android會像我想要的那樣查找lib/.so,Windows也會查找.dll,這是我不想要的。

看來我可以通過使用共享庫變量中的值填充導入庫變量(僅在Linux上)來修復此問題。但是......這真的是最好的方式嗎?我不可能成爲第一個遇到這個問題的人。

回答

1

通常你讓CMake及其助手做這個工作來找出正確的名字。很有可能,對於你的第三方庫,已經有一個Find<Library>.cmake腳本了。

如果沒有:下面是來自GNU Radio

if(NOT LIBUSB_FOUND) 
    pkg_check_modules (LIBUSB_PKG libusb-1.0) 
    find_path(LIBUSB_INCLUDE_DIR NAMES libusb.h 
    PATHS 
    ${LIBUSB_PKG_INCLUDE_DIRS} 
    /usr/include/libusb-1.0 
    /usr/include 
    /usr/local/include 
) 

    find_library(LIBUSB_LIBRARIES NAMES usb-1.0 usb 
    PATHS 
    ${LIBUSB_PKG_LIBRARY_DIRS} 
    /usr/lib 
    /usr/local/lib 
) 

if(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) 
    set(LIBUSB_FOUND TRUE CACHE INTERNAL "libusb-1.0 found") 
    message(STATUS "Found libusb-1.0: ${LIBUSB_INCLUDE_DIR}, ${LIBUSB_LIBRARIES}") 
else(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) 
    set(LIBUSB_FOUND FALSE CACHE INTERNAL "libusb-1.0 found") 
    message(STATUS "libusb-1.0 not found.") 
endif(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) 

mark_as_advanced(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARIES) 

endif(NOT LIBUSB_FOUND) 

通知的pkg_check_modules指令和find_library指令,如果沒有你的手,追加後綴等採取的給你正確後事從FindUSB.cmake採取什麼

您可能希望將您希望將.dll添加到PATHS參數find_pathfind_library(這些是指針讓CMake知道在哪裏看)。

+0

謝謝。我有一個後續問題。其中一些庫是使用ExternalProject下載和編譯的,這意味着它們在構建時間之前不會存在。這在運行初始cmake命令時會導致問題,因爲它不能與保存NOTFOUND值的變量鏈接。 –

+0

通常,你會有自己的CMakeLists.txt的子目錄,並運行包含這些,並從那裏運行。但是,現實世界通常要複雜得多。在StackOverflow上提出一個全新的問題,並提供更多詳細信息:) –