CMake связывает один класс в другом проекте

#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 (на который вы ссылаетесь) необходимо внести несколько изменений.

  1. CMakeList.txt файл должен содержать свойство ENABLE_EXPORTS:

    add_executable(MyProject foo.c)
    set_property(ЦЕЛЕВОЕ СВОЙСТВО MyProject ENABLE_EXPORTS 1)

    Это свойство реагирует по-разному в зависимости от ОС. С ОС Windows это создаст .файл библиотеки в стороне от обычного EXE-файла.

  2. Необходимо экспортировать внешние подписи:

    #define ЭКСПОРТИРУЕМЫЙ_API __declspec(dllexport)

    класс ЭКСПОРТИРОВАННЫЙ_АПИ MyProject {…}
    или
    int EXPORTED_API func() {…}