Problem statement:
Unable to build static library when BUILD_SHARED_LIBS=OFF
(No issues when BUILD_SHARED_LIBS=ON
)
Input:
OS: Ubuntu 20.04
Project Structure:
---- foo
|- CMakeList.txt
|- modules
| - CMakeLists.txt
|- common
| - CMakeLists.txt
| - include
| - src
|- device
| - CMakeLists.txt
| - include
| - src
|- foolib
| - CMakeLists.txt
| ....
All libs from modules are INTERFACE libs without export and install of the targets. (this is my requirement)
below are the CMake files for the reference.
common: CMakeLists.txt
add_library(common INTERFACE)
target_sources(common INTERFACE ${COMMON_SOURCES})
#------------------
# Compiler settings
#------------------
target_include_directories(common
INTERFACE
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${COMMON_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${COMMON_BINARY_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
)
target_compile_definitions(common
INTERFACE
COMMON_LOGGING_STRIP_PREFIX="${ROOT_PROJECT_PATH}"
)
target_link_libraries(
common
INTERFACE
$<BUILD_INTERFACE:fmt::fmt-header-only>
)
device : CMakeLists.txt
add_library(device INTERFACE )
target_sources(device INTERFACE ${DEVICE_SOURCES})
target_include_directories(device
INTERFACE
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${DEVICE_BINARY_DIR}/include>
$<BUILD_INTERFACE:${DEVICE_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
)
target_include_directories(device SYSTEM
INTERFACE
${XMLRPC_INCLUDE_DIRS}
)
target_link_libraries(
device
INTERFACE
common
CURL::libcurl
xmlrpc++
xmlrpc
xmlrpc_client++
xmlrpc_client
$<BUILD_INTERFACE:asio>
$<BUILD_INTERFACE:fmt::fmt-header-only>
)
foolib : CMakeList.txt
## Target: foolib.so
################################################
add_library(foolib)
#------------------
# Compiler settings
#------------------
if(WIN32)
target_compile_definitions(lib3d PRIVATE LIB3D_DLL_BUILD=1)
endif(WIN32)
#------------------
# Linker settings
#------------------
target_link_libraries(
foolib
PRIVATE
common
device
$<BUILD_INTERFACE:fmt::fmt-header-only>
$<BUILD_INTERFACE:asio>
)
if(BUILD_MODULE_FRAMEGRABBER)
target_link_libraries(foolib PRIVATE framegrabber)
endif()
if(BUILD_MODULE_SWUPDATER)
target_link_libraries(foolib PRIVATE swupdater)
endif()
set_target_properties(foolib PROPERTIES
VERSION ${ROOT_PROJECT_VERSION_SIMPLE}
EXPORT_NAME lib3d
OUTPUT_NAME lib3d
LINKER_LANGUAGE CXX
POSITION_INDEPENDENT_CODE 1
)
if(WIN32)
if(${BUILD_SHARED_LIBS})
target_compile_definitions(
foolib PRIVATE
DLL_BUILD=1
)
else()
target_compile_definitions(
foolib PUBLIC
STATIC_LIB=1
)
endif()
endif(WIN32)
if(CMAKE_CXX_COMPILER_ID MATCHES GNU)
set_target_properties(foolib PROPERTIES CXX_VISIBILITY_PRESET hidden)
endif()
#------------------
# Installation
#------------------
install(TARGETS foolib
EXPORT lib3d
COMPONENT lib3d
RUNTIME DESTINATION ${_bin}
LIBRARY DESTINATION ${_lib}
ARCHIVE DESTINATION ${_lib}
PUBLIC_HEADER DESTINATION ${_include}
)
# create the cmake-package files
if(BUILD_SDK_PKG)
install(EXPORT lib3d
FILE lib3d-targets.cmake
NAMESPACE lib3d::
DESTINATION ${_lib}/cmake/lib3d-${LIB3D_VERSION}
COMPONENT lib3d
)
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/lib3d-config-version.cmake
VERSION ${LIB3D_VERSION}
COMPATIBILITY SameMinorVersion
)
configure_package_config_file(
${ROOT_PROJECT_DIR}/cmake/modules/lib3d-config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/lib3d-config.cmake
INSTALL_DESTINATION ${_lib}/cmake/lib3d-${LIB3D_VERSION}
)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/lib3d-config-version.cmake
${CMAKE_CURRENT_BINARY_DIR}/lib3d-config.cmake
DESTINATION ${_lib}/cmake/lib3d-${LIB3D_VERSION}
COMPONENT lib3d
)
endif()
Error:
CMake Error: install(EXPORT "lib3d" ...) includes target "foolib" which requires target "device" that is not in any export set.
I am trying to build the static libs without exporting the required target.
Can anyone please suggest some approach to archive this. Any help would be appreciated.
Looking for some solution to achieve this.
Vikas Gaikwad is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.