CMake Репликация статической библиотеки Visual Studio Создание статической библиотеки с дополнительными зависимостямиC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 CMake Репликация статической библиотеки Visual Studio Создание статической библиотеки с дополнительными зависимостями

Сообщение Anonymous »

Я новичок в CMake и пытаюсь создать статическую библиотеку, которую можно использовать в разных приложениях.
У меня есть MyLibrary CMakeLists.txt

Код: Выделить всё

cmake_minimum_required(VERSION 3.10)

# Set the project name
project(MyLibrary)

# Specify the C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(BUILD_MODE "x64" CACHE STRING "Build mode: x64 or Win32")

# Collect all source files, including MyLibrary and GUI implementations
file(GLOB_RECURSE GUI_SOURCES src/GUI/*.cpp)
set(SOURCES
src/MyLibrary.cpp
${GUI_SOURCES} # Add collected GUI sources
)

# Define the library target
add_library(MyLibrary STATIC ${SOURCES})

# Link the third-party libraries (PUBLIC to propagate)
target_link_libraries(MyLibrary PUBLIC
${CMAKE_SOURCE_DIR}/ThirdParty/GLFW/lib/${BUILD_MODE}/glfw3.lib
${CMAKE_SOURCE_DIR}/ThirdParty/GLEW/lib/${BUILD_MODE}/glew32s.lib
opengl32.lib
)

# Include directories for public headers
target_include_directories(MyLibrary PUBLIC
${PROJECT_SOURCE_DIR}/include
${PROJECT_SOURCE_DIR}/include/GUI # Add GUI include folder
)

# Include directories for third-party libraries
target_include_directories(MyLibrary PUBLIC
${CMAKE_SOURCE_DIR}/ThirdParty/GLFW/include
${CMAKE_SOURCE_DIR}/ThirdParty/GLEW/include
${CMAKE_SOURCE_DIR}/ThirdParty/GLM
)
Я создаю MyLibrary с помощью следующих команд:

Код: Выделить всё

cmake -S . -B build
cmake --build .\build\
При этом создается MyLibrary.lib, но когда я пытаюсь использовать его в примере приложения, такого как MyApplication:

Код: Выделить всё

cmake_minimum_required(VERSION 3.10)

project(MyApplication)

# Add the executable
add_executable(MyApplication src/main.cpp)

# Link MyLibrary
target_link_libraries(MyApplication PRIVATE
${CMAKE_SOURCE_DIR}/../MyLibrary/build/Debug/MyLibrary.lib
)

# Include MyLibrary additional headers
target_include_directories(MyApplication PRIVATE
${CMAKE_SOURCE_DIR}/../MyLibrary/include
${CMAKE_SOURCE_DIR}/../MyLibrary/ThirdParty/GLFW/include
${CMAKE_SOURCE_DIR}/../MyLibrary/ThirdParty/GLEW/include
${CMAKE_SOURCE_DIR}/../MyLibrary/ThirdParty/GLM
)
Я получаю ошибки «неразрешенный внешний символ», потому что библиотека GLFW не распространяется. Я могу обойти эту проблему, скопировав target_link_libraries из MyLibrary в MyApplication, но мне не нужно было перечислять все зависимости MyLibrary, когда я собирал ее с помощью Visual Studio.
Это возможно, когда я создаю статическую библиотеку с помощью Visual Studio, добавляя сторонние библиотеки в «Свойства>Библиотекарь>Дополнительные зависимости» и собирая ее с помощью Visual Studio. MyApplication компилируется правильно, если он включает только MyLibrary.lib. В сгенерированном MyLibrary.vcxproj я вижу раздел, в котором перечислены все библиотеки .
Но когда я собираю только с помощью команд cmake , в созданном MyLibrary.vcxproj отсутствуют дополнительные зависимости, а созданный MyLibrary.lib намного меньше и не распространяет свои зависимости. Я чувствую, что должен быть способ сделать это только с помощью CMake.
Любые предложения приветствуются.
РЕДАКТИРОВАТЬ:Этот вопрос был помечен как дубликат, но дубликат сообщения не отвечает на мой вопрос. Я нашел решение и хотел поделиться им, так как видел, как этот вопрос задавался несколько раз без решения.
Я нашел это в обсуждении gitlab cmake, задавая тот же вопрос, что и у меня: https:// gitlab.kitware.com/cmake/cmake/-/issues/16931
В обсуждении упоминалось добавление

Код: Выделить всё

set ( CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} somelib.lib" )
Это предложение сработало для моего проекта:

Код: Выделить всё

set (
CMAKE_STATIC_LINKER_FLAGS
"${CMAKE_STATIC_LINKER_FLAGS}
${CMAKE_SOURCE_DIR}/ThirdParty/GLEW/lib/${BUILD_MODE}/glew32s.lib
${CMAKE_SOURCE_DIR}/ThirdParty/GLFW/lib/${BUILD_MODE}/glfw3.lib
opengl32.lib"
)
Это повторяет зависимости дополнений библиотекарей, которые я видел при сборке MyLibrary с помощью Visual Studio. Теперь я могу собрать MyLibrary с помощью только команд CMake, и когда другие мои проекты включают MyLibrary.lib, они также получат символы для зависимостей MyLibrary.lib. Я думаю, что эта комбинация нескольких статических библиотек называется толстой статической библиотекой


Подробнее здесь: https://stackoverflow.com/questions/790 ... ditional-d
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»