#c #cmake #shared-libraries #static-libraries
#c #cmake #разделяемые библиотеки #статические библиотеки
Вопрос:
это один из моих первых проектов на c , и у меня возникли проблемы с CMake.
У меня есть MyProject с исполняемым, и я получил тесты проекта с повышающими модульными тестами. Я попробовал это следующим образом, но у меня не получилось. Очевидно, что у меня не может быть двух исполняемых файлов таким образом, и я не знаю, как это исправить.
Это CMake MyProject
project (MyProject)
find_package( Boost 1.48.0 COMPONENTS thread )
set(MYPROJECT_SRCS main.cpp foo.h foo.cpp)
add_executable(MyProject ${MYPROJECT_SRCS})
target_link_libraries(MyProject ${Boost_LIBRARIES})
Это CMake тестов
project (tests)
find_package( Boost 1.48.0 COMPONENTS thread unit_test_framework)
find_package( Boost 1.48.0 COMPONENTS thread )
include_directories("../MyProject")
set(TEST_SRCS test.cpp )
add_executable(tests ${TEST_SRCS})
target_link_libraries(tests ${Boost_LIBRARIES} MyProject)
add_test( example_test tests )
Ошибка CMake при тестировании/CMakeLists.txt:13 (target_link_libraries):
Целевой объект «MyProject» типа EXECUTABLE не может быть связан с другим
целевым объектом. Можно ссылаться только на СТАТИЧЕСКИЕ или РАЗДЕЛЯЕМЫЕ библиотеки или на
исполняемые файлы с набором свойств ENABLE_EXPORTS .
Я попытался «ВКЛЮЧИТЬ набор свойств EXPORTS», но, думаю, я сделал это неправильно.
Комментарии:
1. Пожалуйста, задайте более подходящий заголовок вашего вопроса.
Ответ №1:
Вы не должны связывать свой исполняемый файл с тестами, вместо этого вам нужно включить исходные файлы вашего основного проекта в список исходных текстов тестов:
set(TEST_SRCS test.cpp ../MyProject/foo.cpp)
target_link_libraries(tests ${Boost_LIBRARIES} )
PS Также это будет полезно, когда вы захотите проанализировать тестовое покрытие.
Комментарии:
1. Не могли бы вы привести мне краткий пример этого. Я действительно новичок в CMake!
2. В ваших тестах
CMakeList.txt
измените две строки из моего ответа.
Ответ №2:
В проекте MyProject (на который вы ссылаетесь) необходимо внести несколько изменений.
-
CMakeList.txt файл должен содержать свойство ENABLE_EXPORTS:
add_executable(MyProject foo.c)
set_property(ЦЕЛЕВОЕ СВОЙСТВО MyProject ENABLE_EXPORTS 1)Это свойство реагирует по-разному в зависимости от ОС. С ОС Windows это создаст .файл библиотеки в стороне от обычного EXE-файла.
-
Необходимо экспортировать внешние подписи:
#define ЭКСПОРТИРУЕМЫЙ_API __declspec(dllexport)
класс ЭКСПОРТИРОВАННЫЙ_АПИ MyProject {…}
или
int EXPORTED_API func() {…}