包含另一个 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 项目作为库的主要内容,如果未能解决你的问题,请参考以下文章