Включить другой проект 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-файле, который вы включили в свой проект. Это не большое изменение в источнике, но вам придется делать это локально.