cmake导入存在SimpleAmqp库

现在我的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_libraryfind_libraryPUBLIC是否正确使用。任何帮助将不胜感激。

Solutions Collecting From Web of "cmake导入存在SimpleAmqp库"

你已经搞乱了变量目标属性

正确使用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 )。

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

代码的简化版本:

 # 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)