cmake导入存在SimpleAmqp库

时间:2017-05-17 02:33:54

标签: windows cmake rabbitmq

现在我的CMakeList.txt看起来像这样。

cmake_minimum_required(VERSION 3.6)
project(RabbitMQClient)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp)
include_directories(src)
include_directories(dependentFile)
add_executable(RabbitMQClient ${SOURCE_FILES})
find_library(SimpleAmqpClient SimpleAmqpClient.2.lib PATHS ./SimpleAmqpClientLib/SimpleAmqpClient.2.lib)
set(IMPORTED_IMPLIB ./SimpleAmqpClientLib)
target_link_libraries(RabbitMQClient PUBLIC SimpleAmqpClient)

当链接RabbitMQClient时,它会抱怨。

  

找不到-lSimpleAmqpClient

我想在项目中使用SimpleAmqpClient库,但不熟悉cmake不确定find_libraryIMPORTED_IMPLIBPUBLIC在{ {1}}被正确使用。任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

你搞砸了变量目标属性

正确使用IMPORTED库进行链接:

# This command sets *variable* SimpleAmqpClient_LIBRARY
find_library(SimpleAmqpClient_LIBRARY SimpleAmqpClient.2.lib
    PATHS ${CMAKE_SOURCE_DIR}/SimpleAmqpClientLib # Specify a *directory*, not a library *file*
)
# Next, create an IMPORTED *target*
add_library(SimpleAmqpClient SHARED IMPORTED)
# And set IMPORTED_LIB *property* for this target
set_target_properties(SimpleAmqpClient PROPERTIES IMPORTED_LIB ${SimpleAmqpClient_LIBRARY})
# Then use library *target* for linking with
target_link_libraries(RabbitMQClient PUBLIC SimpleAmqpClient)

然而,可以做一些简化:

  1. 通常,当您不知道库文件的完整路径时,会使用find_library。例如,它的目录在不同的机器上可能不同,或者前缀 / 扩展名在不同的平台上可能有所不同。

    如果您知道库的完整路径,请直接使用此路径(例如,将其分配给变量)。

  2. 通常,属性 IMPORTED_LOCATION 用于指定要链接的库。属性 IMPORTED_LIB 特定于Windows .dll,当链接不需要库文件(.dll),而是其他一些文件(.lib)。

    但是,即使对于Windows .lib,CMake也完全理解 IMPORTED_LOCATION 属性中的.dll文件,因此您的代码无需区分 SHARED Windows库来自其他人:在所有情况下都使用 IMPORTED_LOCATION 属性。

  3. 简化版本的代码:

    # Create an IMPORTED library *target*
    add_library(SimpleAmqpClient IMPORTED)
    # Set IMPORTED_LOCATION *property* for this target
    set_target_properties(SimpleAmqpClient PROPERTIES
        IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/SimpleAmqpClientLib/SimpleAmqpClient.2.lib)
    # Then use library *target* for linking with
    target_link_libraries(RabbitMQClient PUBLIC SimpleAmqpClient)