1

I used CMake to compile a framework into three different .lib files, and one .sln file. The project is structured as such

UeiDaqFramework |-CMakeLists.txt |-build | |-Framework_static.sln | | - other cmake files and stuff |-UeiDaqCore | |-CMakeLists.txt | |-source code for this subproject |-UeiSimuDriver | |-CMakeLists.txt | |-source code for this subproject |-UeiPDNADriver | |-CMakeLists.txt | |-source code for this subproject | |-Output |-UeiDaqCore.lib |-UeiSimuDriver.lib |-UeiPDNADriver.lib 

My test code require a Framework_static.lib in its include file instead of a .sln file, and I do not know how to combine the three existing .lib files using cmake. I did attempt to follow what this CMake - combine multiple libraries into one answer suggested, by just building all the source files into a single library, but I'm new to CMake, and it did not work. Here is the CmakeLists.txt file at the top directory of my project.

cmake_minimum_required(VERSION 3.13.0 FATAL_ERROR) set(CMAKE_SYSTEM_VERSION CACHE TYPE INTERNAL FORCE) project(Framework_static_vc15) ################################################################################ # Set target arch type if empty. Visual studio solution generator provides it. ################################################################################ if(NOT CMAKE_VS_PLATFORM_NAME) set(CMAKE_VS_PLATFORM_NAME "x64") endif() message("${CMAKE_VS_PLATFORM_NAME} architecture in use") if(NOT ("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32")) message(FATAL_ERROR "${CMAKE_VS_PLATFORM_NAME} arch is not supported!") endif() ################################################################################ # Global configuration types ################################################################################ set(CMAKE_CONFIGURATION_TYPES "Debug" "Release" CACHE STRING "" FORCE ) ################################################################################ # Global compiler options ################################################################################ if(MSVC) # remove default flags provided with CMake for MSVC set(CMAKE_CXX_FLAGS "") set(CMAKE_CXX_FLAGS_DEBUG "") set(CMAKE_CXX_FLAGS_RELEASE "") endif() ################################################################################ # Global linker options ################################################################################ if(MSVC) # remove default flags provided with CMake for MSVC set(CMAKE_EXE_LINKER_FLAGS "") set(CMAKE_MODULE_LINKER_FLAGS "") set(CMAKE_SHARED_LINKER_FLAGS "") set(CMAKE_STATIC_LINKER_FLAGS "") set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS}") set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS}") set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS}") set(CMAKE_STATIC_LINKER_FLAGS_DEBUG "${CMAKE_STATIC_LINKER_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS}") set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS}") set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS}") set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS}") endif() ################################################################################ # Nuget packages function stub. ################################################################################ function(use_package TARGET PACKAGE VERSION) message(WARNING "No implementation of use_package. Create yours.") endfunction() ################################################################################ # Common utils ################################################################################ include(CMake/Utils.cmake) ################################################################################ # Additional Global Settings(add specific info there) ################################################################################ include(CMake/GlobalSettingsInclude.cmake OPTIONAL) ################################################################################ # Use solution folders feature ################################################################################ set_property(GLOBAL PROPERTY USE_FOLDERS ON) ################################################################################ # Sub-projects ################################################################################ add_subdirectory(Source/UeiDaqCore) add_subdirectory(Source/UeiPDNADriver) add_subdirectory(Source/UeiSimuDriver) 

These CMakeLists.txt files were generated automatically by a generator that takes a visual studio .sln file and converts it to a .txt tree. Heres the link to the converter if anyone is interested. https://cmakeconverter.readthedocs.io/en/develop/intro.html

Im not sure if I need to rewrite Just the top level .txt file, or if I need to rewrite all the CMakeLists.txt files. Any help would be appreciated.

1 Answer 1

3

I assume the build of the shared libs is within the subdirectories, because your CMakeLists.txt does not contain any add_library command.

To get a static library containing all sources you have to

  1. Collect all sources
  2. Add command to build the static library

For 1. add the following to every subdir/CMakeLists.txt

set(SOURCES # This creates a list of sources called SOURCES myFileA.cpp # This adds an item to the list myFileB.cpp ${SOURCES} # This adds all items of existing list SOURCES to the current list PARENT_SCOPE # This makes SOURCES visible in the parent CMakeLists.txt ) 

For 2. add the static library

add_library(myTestLib_static.c STATIC ${SOURCES}) 
Sign up to request clarification or add additional context in comments.

1 Comment

Ah. Ill give that a shot

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.