现在我的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_library
,IMPORTED_IMPLIB
,PUBLIC
在{ {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)
然而,可以做一些简化:
通常,当您不知道库文件的完整路径时,会使用find_library
。例如,它的目录在不同的机器上可能不同,或者前缀 / 扩展名在不同的平台上可能有所不同。
如果您知道库的完整路径,请直接使用此路径(例如,将其分配给变量)。
通常,属性 IMPORTED_LOCATION 用于指定要链接的库。属性 IMPORTED_LIB 特定于Windows .dll
,当链接不需要库文件(.dll
),而是其他一些文件(.lib
)。
但是,即使对于Windows .lib
,CMake也完全理解 IMPORTED_LOCATION 属性中的.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)