我有一个 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
# )
curlpp
项目为静态库和共享库创建单独的targets:
curlpp
目标代表共享库,curlpp_static
target 代表静态库。在
target_link_libraries
通话中,您可以使用适合您目的的目标。例如
target_link_libraries(${TARGET} curlpp_static)
将链接到静态 curlpp 库。