У меня есть 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
)
Код: Выделить всё
cmake -S . -B build
cmake --build .\build\
Код: Выделить всё
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
)
Это возможно, когда я создаю статическую библиотеку с помощью 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"
)
Подробнее здесь: https://stackoverflow.com/questions/790 ... ditional-d