首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >项目A依赖共享库B,B依赖C,A不依赖C。当我使用B的API时,警告B找不到C

项目A依赖共享库B,B依赖C,A不依赖C。当我使用B的API时,警告B找不到C
EN

Stack Overflow用户
提问于 2019-09-09 13:48:36
回答 1查看 70关注 0票数 0

项目A依赖于共享库BB依赖于CA不依赖于CB作为共享库进行编译和安装。当A使用B接口时,会出现如下代码所示的B找不到C的警告。

在该代码中,ALibTestBTdLibCpangolin

代码语言:javascript
复制
Scanning dependencies of target LibTest
[ 50%] Building CXX object CMakeFiles/LibTest.dir/main.cpp.o
[100%] Linking CXX executable LibTest
/usr/bin/ld: warning: libpangolin.so, needed by /home/wang/CLionProjects/TdLibrary/install/lib/libTdLib.so, not found (try using -rpath or -rpath-link)
/home/wang/CLionProjects/TdLibrary/install/lib/libTdLib.so: 'pangolin::CreateDisplay()’ undefined reference
...
collect2: error: ld returned 1 exit status
CMakeFiles/LibTest.dir/build.make:84: recipe for target 'LibTest' failed
make[3]: *** [LibTest] Error 1
CMakeFiles/Makefile2:109: recipe for target 'CMakeFiles/LibTest.dir/all' failed
make[2]: *** [CMakeFiles/LibTest.dir/all] Error 2
CMakeFiles/Makefile2:121: recipe for target 'CMakeFiles/LibTest.dir/rule' failed
make[1]: *** [CMakeFiles/LibTest.dir/rule] Error 2
Makefile:131: recipe for target 'LibTest' failed
make: *** [LibTest] Error 2

共享库BCMakelist.txt

代码语言:javascript
复制
add_library(TdLib SHARED
        pangolin_tools.cpp
        pangolin_tools.h
        )

#pangolin
find_package(Pangolin REQUIRED)
include_directories(${Pangolin_INCLUDE_DIRS} )

set(HEADER_FILES
        pangolin_tools.h
        )
set_target_properties(TdLib PROPERTIES
        PUBLIC_HEADER
        "${HEADER_FILES}"
        )

target_link_libraries(TdLib PRIVATE
                    ${Pangolin_LIBRARIES}
                    )

install(TARGETS TdLib
        # IMPORTANT: Add the foo library to the "export-set"
        EXPORT ${PROJECT_NAME}Targets
        RUNTIME DESTINATION "${INSTALL_BIN_DIR}" COMPONENT bin
        LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT shlib
        PUBLIC_HEADER DESTINATION "${INSTALL_INCLUDE_DIR}/TdLibrary"
        COMPONENT dev)

我通过以下方式安装B

代码语言:javascript
复制
cmake .. -DCMAKE_INSTALL_PREFIX:=/home/wang/CLionProjects/TdLibrary/install
make
make install

项目ACMakelist.txt

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.9)
project(LibTest)
set(CMAKE_CXX_STANDARD 11)

#TdLib
set(TdLib_DIR "/home/wang/CLionProjects/TdLibrary/install/lib/CMake/TdLib/")
find_package(TdLib REQUIRED)
include_directories(${TdLib_INCLUDE_DIRS})

add_executable(LibTest main.cpp)
target_link_libraries(LibTest ${TdLib_LIBRARIES}
EN

回答 1

Stack Overflow用户

发布于 2019-09-09 15:55:24

您肯定会链接到共享库。

在下面的代码中,我将删除PRIVATE关键字:

代码语言:javascript
复制
target_link_libraries(TdLib PRIVATE
                    ${Pangolin_LIBRARIES}
                    )

看看这是否有帮助。在我这方面,我注意到您可以在没有任何target_link_libraries()的情况下链接库,这会迫使您在构建可执行文件时添加库。

我还猜测这个PRIVATE关键字可能并不完全如您所想的那样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57848461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档