【问题标题】:Include another CMake Project as Library包含另一个 CMake 项目作为库
【发布时间】: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 以便我们处理吗?

标签: c++ c qt4 cmake kdevelop


【解决方案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 头文件中的结构,而且我认为使用函数不会离那里很远。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多