将另一个CMake项目包含为库

时间:2011-01-25 10:55:49

标签: c++ c qt4 cmake kdevelop

我决定使用KDevelop为C程序(我不知道的两种语言)制作C ++ - Qt-GUI,而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 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我对此有点生疏,但你可以做一些事情:

在oregengui.c

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

在你想要的CMakeLists中:

add_definitions( -DMYGUIPROJ )

编译器应该忽略你的第二个主要功能。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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