У меня есть папка проекта C ++, которая содержит две папки.
папка C ++ src с несколькими подпапками и файл CmakeList.txt. Папка src содержит файл main.cpp.
**Cmakelist.txt src folder**
project (TestProject)
# Include all global directories and the current directory
include_directories(${GLOBAL_INCLUDES} ".")
link_directories(${GLOBAL_LIB_DIRS})
file(GLOB_RECURSE GLOBAL_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" "*.cpp")
add_executable(${PROJECT_NAME} ${GLOBAL_SOURCES})
target_link_libraries(${PROJECT_NAME} ${GLOBAL_LIBS})
set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "d")
install(TARGETS ${PROJECT_NAME} DESTINATION ${INSTALL_DIR})
стандартная внешняя папка ExtLib для сборки на C ++, содержащая несколько подпапок, и скрипт build.sh для его компиляции и файл CmakeList.txt. Файлы .cpp из папки src связаны (включая файлы заголовков (.h)) с этой папкой ExtLib.
Папка Project содержит основной файл build.sh, который компилирует проект и создает папку build, включающую конфигурации отладки и выпуска. Он также содержит файл CmakeList.txt, который, я полагаю, выполняется при запуске файла build.sh. Задача, которую мне нужно выполнить в этом проекте, — создать новую папку для тестов и добавить файл (RunAllTests.cpp), который выполняет модульное тестирование (с использованием catch unit-test) в коде, записанном в файлах .cpp папки src.
Проблема, с которой я сталкиваюсь:
Первая проблема — когда я создаю исходный тестовый файл в своей папке тестов и пытаюсь включить заголовочные файлы из папки src, компилятор выдает фатальную ошибку, что такие (.h) файлы не найдены, что означает, что если я включу файл в Исходный файл папки тестов, который включает в себя заголовочный файл из папки ExtLib — тогда я получаю сообщение об ошибке при связывании файлов из папки ExtLib в файлах тестовой папки через файлы папки src. Все ли мои файлы Cmakelist написаны правильно?
**Cmakelist.txt tests folder**
cmake_minimum_required(VERSION 3.5)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
include_directories(../src)
include_directories(../ExtLib)
link_directories(${GLOBAL_LIB_DIRS})
add_library(AConfigTest ./aconfigtest/AConfigTest.cpp)
add_library(AClientTest ./aclienttest/AClientTest.cpp)
add_library(AServerTest ./aservertest/AServerTest.cpp)
file(GLOB_RECURSE GLOBAL_SOURCES
"${PROJECT_SOURCE_DIR}/src/AConfig/*.cpp""${PROJECT_SOURCE_DIR}/src/AClient/*.cpp""${PROJECT_SOURCE_DIR}/src/AServer/*.cpp""${PROJECT_SOURCE_DIR}/src/ErrorLogger.cpp")
add_executable(tests RunAllTests.cpp ${GLOBAL_SOURCES})
set_target_properties(tests PROPERTIES DEBUG_POSTFIX "d")
target_link_libraries(tests ${GLOBAL_LIBS}
AConfigTest
AClientTest
AServerTest
)
Второй вопрос: если каким-то образом я могу успешно включать файлы из других папок src или ExtLib, как я могу запустить исходный файл теста RunAllTests.cpp для выполнения моих тестовых случаев? Все ли мои файлы Cmakelist написаны правильно?
Я застрял в этой проблеме с 3 недель, мне отчаянно нужно решение для этого. Ниже приведена ошибка компилятора:
Ошибка компилятора:
make[2]: Entering directory '/home/Caspian/TestProject/build/linux/debug'
[ 56%] Building CXX object tests/CMakeFiles/tests.dir/RunAllTests.cpp.o
cd /home/Caspian/TestProject/build/linux/debug/tests && /usr/bin/c++ -I/home/Caspian/TestProject/tests/../src -I/home/Caspian/TestProject/tests/../ExtLib -g -o CMakeFiles/tests.dir/RunAllTests.cpp.o -c /home/Caspian/TestProject/tests/RunAllTests.cpp
In file included from /home/Caspian/TestProject/tests/RunAllTests.cpp:14:0:
/home/Caspian/TestProject/tests/../src/AConfig/Config.h:16:29: fatal error: xxplatformlayer.h: No such file or directory
compilation terminated.
tests/CMakeFiles/tests.dir/build.make:62: recipe for target 'tests/CMakeFiles/tests.dir/RunAllTests.cpp.o' failed
make[2]: *** [tests/CMakeFiles/tests.dir/RunAllTests.cpp.o] Error 1
make[2]: Leaving directory '/home/Caspian/TestProject/build/linux/debug'
CMakeFiles/Makefile2:277: recipe for target 'tests/CMakeFiles/tests.dir/all' failed
make[1]: *** [tests/CMakeFiles/tests.dir/all] Error 2
make[1]: Leaving directory '/home/Caspian/TestProject/build/linux/debug'
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2
make failed.
Проектная иерархия показана ниже:
/TestProject
│ build.sh
│ CMakeList.txt
/ExtLib
│ build.sh
│ CMakeList.txt
│ debug
│ release
│ A/include/..(multiple subfolders and .cpp files)
/src
│ build.sh
│ CMakeList.txt
│ AServer(multiple subfolders and .cpp files)
│ AClient(multiple subfolders and .cpp files)
│ AConfigt(multiple subfolders and .cpp files)
/tests
│ CMakeList.txt
│ RunAllTests.cpp
│ aservertest/AServerTest.cpp (testing src AServer)
│ aclienttest/AClientTest.cpp (testing src AClient)
│ aconfigtest/AConfigTest.cpp (testing src AConfig)
Задача ещё не решена.
Других решений пока нет …