cmake:针对 STATIC IMPORTED 库的链接失败

Ste*_*mer 5 c++ cmake

我有一个供应商提供的静态库。

我已将其添加为STATIC IMPORTED库目标,并在目标上设置属性:

add_library(
    lime_api 
        STATIC 
        IMPORTED
    )

set_target_properties(
    lime_api 
        PROPERTIES 
        IMPORTED_LOCATION "${CMAKE_CURRENT_LIST_DIR}/trading/limeTradingApi.a"
    )

# users include "api/trading/limeTradingApi.h"
set_target_properties(
    lime_api 
        PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/.."
    )
Run Code Online (Sandbox Code Playgroud)

在我的源代码树的其他地方,我尝试链接到lime_api,但出现错误:

/usr/bin/ld: cannot find -llime_api
Run Code Online (Sandbox Code Playgroud)

我的源代码树如下所示:

src
|
+--- api
|    | 
|    +--- trading
|    |       - limeTradingApi.a
|    |       - limeTradingApi.h
|    |
|    +--- examples
|         |
|         +--- trading
|
+--- order
     |
     +--- example
Run Code Online (Sandbox Code Playgroud)

奇怪的是,有一个供应商提供的示例链接到这个库,并且工作正常:

api/examples/trading/CMakeLists.txt

add_executable       (trading_demo exampleClient.cc)
target_link_libraries(trading_demo lime_api)           <-- this works
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试链接我自己的库时,lime_api我收到了链接器错误。

order/CMakeLists.txt

add_library(
        order
            STATIC
            ${SRCS}
        )
target_link_libraries(order lime_api)                  <-- this doesn't work
Run Code Online (Sandbox Code Playgroud)

order/example/CMakeLists.txt

add_executable       (order_example main.cpp)
target_link_libraries(order_example order)
Run Code Online (Sandbox Code Playgroud)

题:

为什么不CMake的“转换”链接的目标lime_api进入-llimeTradingApi.a了我的可执行文件?

sak*_*kra 5

我怀疑您遇到了IMPORTED库目标的可见性问题。根据文档

An IMPORTED library target references a library file located outside the
project. ... The target name has scope in the directory in which it is
created and below, but the GLOBAL option extends visibility.
Run Code Online (Sandbox Code Playgroud)

这就是为什么正确的库路径用于内部trading_demo目标而不是外部order_example目标的原因。要解决此问题,添加该GLOBAL选项就足够了:

add_library(lime_api STATIC IMPORTED GLOBAL)
Run Code Online (Sandbox Code Playgroud)