包含另一个 CMake 项目作为库

Posted

技术标签:

【中文标题】包含另一个 CMake 项目作为库【英文标题】:Include another CMake Project as Library 【发布时间】:2011-01-25 10:55:49 【问题描述】:

我决定使用 KDevelop 为 C 程序(两种语言我都不知道)制作 C++-Qt-GUI,而后者又使用 CMake。

C 源代码没有头文件,所以我做了一个,并将一些结构迁移到其中,以及 C 源代码中我需要调用的唯一函数的声明。

问题是我无法调用它,因为要么 CMake 找不到 C 文件(因此找不到定义),或者当我将 C 源添加到 CMakeLists.txt 中的源集时,它抱怨我的 main.cpp 和 C 源文件都有 main 函数。

我如何告诉 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 源代码,因为它是一个独立的项目。我猜开发者会接受头部的引入,但不会更多。

【问题讨论】:

您能粘贴您的CMakeLists.txt 以便我们处理吗? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

我对此有点生疏,但你能做一些类似的事情吗:

在oregengui.c中

#if !defined MYGUIPROJ
int main() 
...

#endif

在你想要的 CMakeLists 中:

add_definitions( -DMYGUIPROJ )

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

【讨论】:

Maciek 和您的答案就是解决方案!【参考方案3】:

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

【讨论】:

但是 C 项目将不再编译成可执行文件,因为它没有 main 函数…… 例如,只需将 C 文件添加为可执行文件的一部分,并将其主函数重命名为 dummy_main。您将能够从您的 main 或您的 Qt 东西中使用该功能。 我知道,但我只想重构 C 文件,这样它既可以独立编译,也可以作为我项目的一部分进行编译,而不需要更改任何内容。 你不能。您的可执行文件中只需要一个主要功能。如果您不想修改 C 文件,则必须检查 Arun 关于创建新进程的答案。【参考方案4】:

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

【讨论】:

我什至不使用输出。另一方面,它不是很优雅,因为无论如何我都需要 C 头文件中的结构,而且我认为使用函数不会离那里很远。

以上是关于包含另一个 CMake 项目作为库的主要内容,如果未能解决你的问题,请参考以下文章

处理 cmake 重复的 git 子树

如何在 CMake 项目中包含外部库

CMake:如何构建外部项目并包含其目标

链接 Yaml-cpp 和 Armadillo 共享库的 CMake 项目

将CURL作为静态库添加到C ++ CMake项目中

CMake C++ 包含静态系统库到项目 - 如何