Я работаю над библиотекой Websockets для C ++. В моем проекте есть папка библиотеки и папка tests
.
Папка tests
содержит множество исходных файлов, каждый из которых скомпилирован как отдельный исполняемый файл и считается тестом. Соответствующие списки CMakeLists для него выглядят так:
file(GLOB TEST_SOURCES "src/*.cpp")
foreach(file ${TEST_SOURCES})
get_filename_component(_F_NAME ${file} NAME_WE)
add_executable(${_F_NAME} ${file})
target_link_libraries (${_F_NAME} ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries(${_F_NAME} tiny_websockets_lib Catch)
if(WIN32)
target_link_libraries(${_F_NAME} wsock32 ws2_32)
endif()
add_test(NAME ${_F_NAME} COMMAND ${_F_NAME})
endforeach()
В основном для каждого файла cpp в src/
я создаю новый исполняемый файл и связываю с ним свою библиотеку (здесь она называется tiny_websockets_lib
).
Библиотека CMakeLists.txt выглядит следующим образом:
file(GLOB_RECURSE tinyws_SOURCES
"src/*.cpp"
)
file(GLOB_RECURSE tinyws_HEADERS
"include/*.h"
"include/*.hpp"
)
include_directories(include/tiny_websockets)
add_library(tiny_websockets_lib STATIC ${tinyws_HEADERS} ${tinyws_SOURCES})
set_target_properties(tiny_websockets_lib PROPERTIES LINKER_LANGUAGE CXX)
target_include_directories(tiny_websockets_lib PUBLIC include)
Выпуск:
В библиотеке у меня есть несколько флагов условной компиляции. Например, этот флаг:
#define _WS_CONFIG_NO_TRUE_RANDOMNESS
может быть определено, и это изменит вид библиотеки.
Проблема в том, что библиотека компилируется только один раз , поэтому, если мой тест выглядит так:
#define _WS_CONFIG_NO_TRUE_RANDOMNESS
#include <library_stuff_with_conditional_compile_ifdefs>
int main() {
// tests
}
Библиотека больше не будет компилироваться, и флаг не будет учитываться.
TLDR: Насколько я понимаю, библиотека компилируется один раз и связывается несколько раз. Я хотел бы, чтобы библиотека перекомпилировалась и учитывала основной файл для каждого теста.
Вы можете увидеть фактический проект и структуру здесь: https://github.com/gilmaimon/TinyWebsockets
Спасибо.