从子目录构建库时,强制 CMake 通过动态链接静态库

问题描述 投票:0回答:1

我有一个 CMake 项目,它使用

add_subdirectory()
构建了一些其他库,并使用
target_link_libraries()
链接它们。一个库默认只构建一个静态库,另一个只是一个头文件。但是,
curlpp
构建了共享库和静态库,而没有
option()
来改变该行为。

当我构建我的二进制文件并将其移动到另一个系统时,没有安装 curlpp,我得到一个错误 (

error while loading shared libraries: libcurlpp.so.1: cannot open shared object file: No such file or directory
)。我想强制 CMake 链接到库的静态版本,但到目前为止还没有这样做。

我还尝试将静态库的完整路径传递给

target_link_libraries()
,但这会导致构建时间错误(
No rule to make target 'external/curlpp/libcurlpp.a'
)。如果库已经构建并安装在系统上,我认为这种方法会起作用,但就我而言,它与我的代码同时构建。

这是我的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.20)

project(FOO VERSION 0.1.0 LANGUAGES CXX C)
set(TARGET bar)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

configure_file(include/config.hpp.in include/config.hpp)

add_executable(${TARGET} src/main.cpp)
install(TARGETS ${TARGET} DESTINATION bin)

# DOWNLOAD SUBMODULES
find_package(Git QUIET)
if(GIT_FOUND) 
    option(GIT_SUBMODULE "Check submodules during build" ON)
    if(GIT_SUBMODULE)
        message(STATUS "Submodule update")
        execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive
                        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
                        RESULT_VARIABLE GIT_SUBMODULE_RESULT)
        if(NOT GIT_SUBMODULE_RESULT EQUAL "0")
            message(FATAL_ERROR "git submodule update --init --recursive failed with ${GIT_SUBMODULE_RESULT}")
        endif()
    endif()
endif()
set(CMAKE_POLICY_DEFAULT_CMP0115 OLD) # Supresses libcoap configuration warning
set(ENABLE_DOCS OFF CACHE BOOL "Disable libcoap docs, because they break the build")
set(ENABLE_EXAMPLES OFF CACHE BOOL "Disable libcoap examples, we only want the lib")
set(DTLS_BACKEND "openssl" CACHE STRING "Build libcoap against OpenSSL")
set(ENABLE_TCP OFF CACHE BOOL "Disable TCP, we only want UDP support")
add_subdirectory(external/libcoap)
add_subdirectory(external/plog)
add_subdirectory(external/curlpp)

target_include_directories(${TARGET}
    PUBLIC ${PROJECT_BINARY_DIR}/include
    PUBLIC external/libcoap/include
    PUBLIC external/plog/include
    PUBLIC external/curlpp/include
)

target_link_directories(${TARGET}
    PRIVATE  external/libcoap
    PRIVATE  external/curlpp
)

# THIS ENDS UP LINKING AGAINST THE DYNAMIC LIB
target_link_libraries(${TARGET}
    PRIVATE coap-3 curlpp
)

# PASSING THE FULL PATH TO THE STATIC LIBRARY FAILS
# (No rule to make target 'external/curlpp/libcurlpp.a')
# target_link_libraries(${TARGET}
#     PRIVATE coap-3 ${PROJECT_BINARY_DIR}/external/curlpp/libcurlpp.a
# )
cmake libcurl static-linking
1个回答
0
投票

curlpp
项目为静态库和共享库创建单独的targets

  • curlpp
    目标代表共享库,
  • curlpp_static
    target 代表静态库。

target_link_libraries
通话中,您可以使用适合您目的的目标。例如

target_link_libraries(${TARGET} curlpp_static)

将链接到静态 curlpp 库。

© www.soinside.com 2019 - 2024. All rights reserved.