4

我决定使用 KDevelop 为 C 程序(两种语言我都不知道)制作 C++-Qt-GUI,而后者又使用 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

4 回答 4

2

尝试将 C 文件编译为库并将其与可执行文件链接。

add_library(clib oregengui/oregengui.c)
[...]
add_executable(oregengui ${oregengui_SRCS})
target_link_libraries(oregengui ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} clib)
于 2011-01-25T14:53:13.023 回答
1

我对此有点生疏,但是您可以按照以下方式做一些事情:

在oregengui.c

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

在你想要的 CMakeLists 中:

add_definitions( -DMYGUIPROJ )

然后编译器应该忽略你的第二个主函数。

于 2011-01-25T14:42:43.623 回答
0

您的程序不能同时包含两个主要功能。只需尝试重命名包含到项目中的 C 文件中的 main 函数。这对源的改动不大,但您必须在本地进行。

于 2011-01-25T12:28:33.700 回答
0

如果你的 C 程序有 main 函数,那么它可以独立执行。那么为什么不使用QProcess::execute()方法从 qt 调用应用程序并获取输出呢?

于 2011-01-25T12:36:05.223 回答