【问题标题】:cmake link error on linking shared library hierarchy to executable将共享库层次结构链接到可执行文件时出现cmake链接错误
【发布时间】:2016-08-09 05:54:24
【问题描述】:

在我的项目中,我有以下配置:

  • 低级共享库
  • 共享库是低级共享库的包装器
  • 可执行文件

所以文件树是

CMakeLists.txt
SharedLibraryBase
    CMakeLists.txt
    inc
       myLibBase.h    -> defines MyLibBaseFunction()
    src
       myLibBase.cpp -> implements MyLibBaseFunction()
MySharedLibrary
    CMakeLists.txt
    inc
       myLib.h       -> defines MyLibFunction()
    src
       myLib.cpp     -> implements MyLibFunction()
Executables
    CMakeLists.txt
    inc
       main.h 
    src
       main.cpp   -> calls MyLibFunction()

执行 make 时,出现以下链接错误:

ld.exe: 找不到 -lMySharedLibrary

主要的 CMakeLists.txt 是:

cmake_minimum_required(VERSION 3.5)

project(TestSharedLibraryProject)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "my_outputs")
message("Binary tree path : ${PROJECT_BINARY_DIR}")
add_subdirectory(SharedLibraryBase)
add_subdirectory(MySharedLibrary)
add_subdirectory(Executables)

低级共享库 CMakeLists.txt 是:

###########################
#   SharedLibraiesBase    #
###########################
project(SharedLibraryBase)

# include directories
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${Boost_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/inc)

# find source files
set(${PROJECT_NAME}_headers inc/myLibBase.h)
set(${PROJECT_NAME}_sources src/myLib.cpp)

# create shared library
add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_headers} ${${PROJECT_NAME}_sources})

# add files to export to 'include'
set_property(TARGET ${PROJECT_NAME} PROPERTY PUBLIC_HEADER inc/myLibBase.h)

install (TARGETS ${PROJECT_NAME}
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib/static
        PUBLIC_HEADER DESTINATION include)

包装共享库 CMakeLists.txt 是:

#######################
#   SharedLibraies    #
#######################
project(MySharedLibrary)

# include directories
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${Boost_INCLUDE_DIRS} inc ../SharedLibraryBase/inc)

# find source files
set(${PROJECT_NAME}_headers inc/myLib.h)
set(${PROJECT_NAME}_sources src/myLib.cpp)

# create shared library
add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_headers} ${${PROJECT_NAME}_sources})

#dependency shared library (from this project)
target_link_libraries(${PROJECT_NAME} SharedLibraryBase)

# add files to export to 'include'
set_property(TARGET ${PROJECT_NAME} PROPERTY PUBLIC_HEADER inc/myLib.h)

install (TARGETS ${PROJECT_NAME}
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib/static
        PUBLIC_HEADER DESTINATION include)

可执行的 CMakeLists.txt 是:

####################
#   Executables    #
####################
project(Executables)

# include directories
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${Boost_INCLUDE_DIRS}/inc ${CMAKE_CURRENT_SOURCE_DIR}/../MySharedLibrary/inc)

set(${PROJECT_NAME}_headers inc/main.h)
set(${PROJECT_NAME}_sources src/main.cpp)

#create executable
add_executable(${PROJECT_NAME} ${${PROJECT_NAME}_headers} ${${PROJECT_NAME}_sources})

#dependency shared library (from this project)
target_link_libraries(${PROJECT_NAME} MyShraedLibrary)

install (TARGETS ${PROJECT_NAME}
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib/static)

【问题讨论】:

    标签: cmake


    【解决方案1】:

    你有普通类型错误 MyShraedLibrary 而不是 MySharedLibrary

    【讨论】:

      猜你喜欢
      • 2021-06-16
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多