Включить другой проект CMake в качестве библиотеки

Я решил создать C++-Qt-GUI для программы на C (оба языка, которых я не знаю), используя KDevelop, который, в свою очередь, использует CMake.

Источник C не имеет заголовка, поэтому я создал его и перенес несколько структур в него, а также объявление единственной функции в источнике C, которую мне нужно вызвать.

Проблема в том, что я не могу вызвать его, потому что либо CMake не находит файл C (и, следовательно, определение), либо, когда я добавляю источник C в мой набор исходных файлов в CMakeLists.txt, он жалуется, что оба мой main.cpp и исходный файл C имеют основные функции.

Как мне сказать CMake, что он должен сделать доступной только функцию из файла C, который я объявил в шапке?

вот:

project(oregengui)
cmake_minimum_required(VERSION 2.6)
find_package(Qt4 REQUIRED)

include_directories(${QT_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR})

set(oregengui_SRCS oregengui.cpp main.cpp qrangeslider/qrangeslider.cpp)
#as soon as i add oregengui/oregengui.c, it won’t work because of the main function
qt4_automoc(${oregengui_SRCS})
add_executable(oregengui ${oregengui_SRCS})
target_link_libraries(oregengui ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY})

PS: я не хочу слишком сильно менять источник C, поскольку это независимый проект. Думаю, разработчик примет введение шапки, но не намного.

4 ответа

Решение

Я немного заржавел, но не мог бы ты сделать что-то вроде:

В oregengui.c

#if !defined MYGUIPROJ
int main() {
...
}
#endif

В ваших CMakeLists, которые вы хотите в обоих:

add_definitions( -DMYGUIPROJ )

Затем компилятор должен игнорировать вашу вторую основную функцию.

Попробуйте скомпилировать файл C как библиотеку и связать его с исполняемым файлом.

add_library(clib oregengui/oregengui.c)
[...]
add_executable(oregengui ${oregengui_SRCS})
target_link_libraries(oregengui ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} clib)

Если ваша C-программа имеет основную функцию, то она может быть выполнена независимо. Так почему бы не использовать метод QProcess::execute() для вызова приложения из qt и получения выходных данных?

Ваша программа не может содержать две основные функции одновременно. Просто попробуйте переименовать основную функцию в C-файле, который вы включили в свой проект. Это не большое изменение в источнике, но вам придется делать это локально.

Другие вопросы по тегам