Skip to content

Commit 2ce7b66

Browse files
committed
Доработал сборку
1 parent eb4f35b commit 2ce7b66

2 files changed

Lines changed: 23 additions & 21 deletions

File tree

CMakeLists.txt

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
2222
endif()
2323

2424
option(SIMJSON_BUILD_TESTS "Построить тесты" ON)
25-
option(SIMJSON_IN_SHARED "Функции simjson должны экспортироваться или импортироваться" Off)
25+
option(SIMJSON_IN_SHARED "Функции simjson будут экспортироваться или импортироваться" Off)
2626

2727
add_library(simjson_simjson
2828
src/json.cpp
@@ -56,13 +56,13 @@ function(add_simstr)
5656
set(SIMSTR_BUILD_TESTS OFF)
5757
set(SIMSTR_BENCHMARKS OFF)
5858
if(SIMJSON_IN_SHARED)
59-
set(SIMSTR_SHARED On)
59+
set(SIMSTR_IN_SHARED On)
6060
endif()
6161
FetchContent_Declare(
6262
simstr
6363
GIT_REPOSITORY https://github.com/orefkov/simstr.git
6464
GIT_SHALLOW TRUE
65-
GIT_TAG rel.1.2.1
65+
GIT_TAG 1f225a7
6666
FIND_PACKAGE_ARGS NAMES simstr
6767
)
6868
FetchContent_MakeAvailable(simstr)
@@ -73,8 +73,22 @@ add_simstr()
7373
target_link_libraries(simjson_simjson PUBLIC simstr::simstr)
7474

7575
if(SIMJSON_IN_SHARED)
76+
# Всем объявляем, что мы будем в shared библиотеке
7677
add_compile_definitions(SIMJSON_IN_SHARED)
78+
# Себе объявим, что мы должны экспортировать функции
7779
target_compile_definitions(simjson_simjson PRIVATE SIMJSON_EXPORT)
80+
81+
# Пример построения shared библиотеки, которая включит в себя simjson и simstr.
82+
# Как при этом создать экзешник, пользующийся этой dll - пример в tests/CMakeLists.txt
83+
# Нельзя объявить библиотеку без исходников, добавим просто .h файл
84+
add_library(simjson_dll SHARED include/simjson/json.h)
85+
# simstr нельзя просто так добавить как whole_archive, CMake при сборке simjson уже пометил её как DEFAULT
86+
target_link_libraries(simjson_dll PRIVATE
87+
"$<LINK_LIBRARY:WHOLE_ARCHIVE,simjson::simjson>"
88+
simstr_simstr
89+
)
90+
# Но можно для нужного таргета переопределить её как whole_archive
91+
set_property(TARGET simjson_dll PROPERTY LINK_LIBRARY_OVERRIDE "WHOLE_ARCHIVE,simstr_simstr")
7892
endif(SIMJSON_IN_SHARED)
7993

8094
if(SIMJSON_BUILD_TESTS)
@@ -93,17 +107,6 @@ if(SIMJSON_BUILD_TESTS)
93107
add_subdirectory(tests)
94108
endif()
95109

96-
#[[
97-
# Пример построения shared библиотеки, которая включит в себя simjson и simstr.
98-
# Необходимо также задать опцию SIMJSON_IN_SHARED. Как при этом создать экзешник,
99-
# пользующийся этой dll - пример в tests/CMakeLists.txt
100-
if (SIMJSON_IN_SHARED)
101-
add_library(simjson_dll SHARED include/simjson/json.h)
102-
target_link_libraries(simjson_dll PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,simjson::simjson>,simstr_simstr>")
103-
set_property(TARGET simjson_dll PROPERTY LINK_LIBRARY_OVERRIDE "WHOLE_ARCHIVE,simstr_simstr")
104-
endif()
105-
#]]
106-
107110
# ---- Install rules ----
108111

109112
if(NOT CMAKE_SKIP_INSTALL_RULES)

tests/CMakeLists.txt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,19 @@
22
# project specific logic here.
33
#
44
add_executable(test_json test_json.cpp)
5-
target_link_libraries(test_json simjson::simjson GTest::gtest_main)
65

7-
#[[
8-
# Пример создания экзешника, если simjson и simstr экспортируются из dll.
9-
# Так как мы подключаем только simjson_dll, и входящие в неё либы не видны
10-
# нужно вручную задать каталоги include и стандарт C++20
11-
if (SIMJSON_IN_SHARED)
6+
if (NOT SIMJSON_IN_SHARED)
7+
target_link_libraries(test_json simjson::simjson GTest::gtest_main)
8+
else()
9+
# Пример создания экзешника, если simjson и simstr экспортируются из dll.
10+
# Так как мы подключаем только simjson_dll, и входящие в неё либы не видны
11+
# нужно вручную задать каталоги include и стандарт C++20
1212
target_link_libraries(test_json simjson_dll GTest::gtest_main)
1313
get_target_property(SIMJSON_INCLUDES simjson::simjson INCLUDE_DIRECTORIES)
1414
get_target_property(SIMSTR_INCLUDES simstr::simstr INCLUDE_DIRECTORIES)
1515
target_include_directories(test_json PRIVATE ${SIMJSON_INCLUDES} ${SIMSTR_INCLUDES})
1616
target_compile_features(test_json PUBLIC cxx_std_20)
1717
endif()
18-
#]]
1918

2019
add_test(NAME test_json COMMAND test_json WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
2120

0 commit comments

Comments
 (0)