【问题标题】:QT Creator: Cannot include functions from other files in QT Creator c projectQT Creator:不能在 QT Creator c 项目中包含来自其他文件的函数
【发布时间】:2013-11-23 01:35:31
【问题描述】:

我以前从未尝试过 QT Creator,我想我会为我正在使用的一些测试代码试一试。

长话短说,我无法访问其他 .c 文件中定义的函数。因此,我在 QT Creator 中制作了一个非常简单、愚蠢的程序来尝试查看问题是否仍然存在,并且确实存在。

该程序是一个带有按钮的单个窗口。但是,我的错误可能与按钮完全无关。

我得到的错误是(我知道,这是一个通常非常简单的常见错误): main.o: In function main': /home/user/Documents/dev/st2/st2/main.cpp:9: undefined reference todoubler(int)'

基本上我有一个 C 文件,myfuncts.c,看起来像这样:

#include "myfuncts.h"

int doubler(int a){
return a*2;
}

还有头文件myfuncts.h:

#ifndef MYFUNCTS_H
#define MYFUNCTS_H

int doubler(int a);


#endif // MYFUNCTS_H

(到目前为止,我尽可能保持简单,直到我让它工作为止)。

现在在main.cpp 中我只引用了这个函数一次,而这确实是我在编译时出现错误的地方。这里是main.cpp

#include <QtGui/QApplication>
#include "widget.h"

#include "myfuncts.h"

int main(int argc, char *argv[])
{
    int num = 42;
    num = doubler(num);
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

当我尝试构建时,这是我的错误:

make: Entering directory /home/user/Documents/dev/st2/st2' g++ -o st2 main.o widget.o myfuncts.o moc_widget.o -L/usr/lib -lQtGui -lQtCore -lpthread main.o: In functionmain': /home/user/Documents/dev/st2/st2/main.cpp:9: undefined reference to doubler(int)' collect2: ld returned 1 exit status make: *** [st2] Error 1 make: Leaving directory/home/user/Documents/dev/st2/st2' Exited with code 2. Error while building project st2 When executing build step 'Make'

这是项目文件,st2.pro:

# -------------------------------------------------
# Project created by QtCreator 2013-11-22T17:06:59
# -------------------------------------------------
TARGET = st2
TEMPLATE = app
SOURCES += main.cpp \
    widget.cpp \
    myfuncts.c
HEADERS += widget.h \
    myfuncts.h
FORMS += widget.ui

我试图在这里保持惯例,并允许 QT Creator 为我构建项目文件。我还使用“添加新...”菜单来添加 myfunct.h 和 .c 文件,这两个文件都存在于同一目录中。

进入终端并尝试手动生成同样的错误,我发布它以便可以看到错误之前的步骤:

user@singularity:st2$ 制作 /usr/bin/uic-qt4 widget.ui -o ui_widget.h g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I。 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -一世。 -o main.o main.cpp g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I。 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -一世。 -o widget.o widget.cpp gcc -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I。 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -一世。 -o myfuncts.o myfuncts.c /usr/bin/moc-qt4 -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -一世。小部件.h -o moc_widget.cpp g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I。 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -一世。 -o moc_widget.o moc_widget.cpp g++ -o st2 main.o widget.o myfuncts.o moc_widget.o -L/usr/lib -lQtGui -lQtCore -lpthread main.o:在函数main': /home/user/Documents/dev/st2/st2/main.cpp:9: undefined reference todoubler(int)' collect2: ld 返回 1 个退出状态 制作:*** [st2] 错误 1

nm 确实显示了 myfunct.o 中存在的符号:

user@singularity:st2$ nm myfuncts.o 0000000000000000 T倍增器 用户@奇点:st2$

我过去曾用多个库和 c 文件编写过大型项目,没有遇到任何问题,但我不明白 QT Creator 中发生了什么如此不同。似乎一切都在正确的位置并得到说明,但是,这是我第一次使用 QT,所以一定有什么!

任何帮助将不胜感激!平台是 AMD64 上的 Debian Linux 6.0.2。

【问题讨论】:

    标签: c++ c qt linker


    【解决方案1】:

    将以下内容添加到您的 .pro 文件中:

    INCLUDEPATH += dir/where/is/myfuncts.h
    

    编辑:并尝试添加 extern "C":

    #ifndef MYFUNCTS_H
    #define MYFUNCTS_H
    
    /* Extern "C" */
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    
    int doubler(int a);
    
    
    /* Extern "C" */
    #ifdef __cplusplus
    }
    #endif
    
    
    #endif // MYFUNCTS_H
    

    【讨论】:

    • 至于你的编辑,太棒了。我也可以通过将 .c 文件重命名为 .cpp 来获得相同的结果。不同之处在于符号是如何在编译的目标文件中定义的。查看与 nm 的区别:mycppfuncts.o: 0000000000000000 T _Z10cppdoubleri U __gxx_personality_v 和 c 函数:myfuncts.o: 0000000000000000 T doubler
    • 是的。该错误是链接器错误,因此我怀疑到达正确的标题或名称修改有问题。在 Mac OS X 上,当 C 函数编译时,nm 会打印出相同的函数名称,并在前面加上 _,而使用 C++ 编译器编译的相同函数将生成 _Zwhateversomethingdifferentandlong
    【解决方案2】:

    这是关于“名称错误”的问题。如果要在 C++ 中调用 C 函数,则应在 C++ 文件中使用 extern "C" 声明 C 函数。

    /* file: main.cpp */
    ...
    extern "C" int doubler(int a);
    ...
    

    通常,我们修改 C 头文件,以便在 C++ 代码中更容易#include。所以,你可以这样做,

    / * file: myfuncts.h */
    #ifndef MYFUNCTS_H
    #define MYFUNCTS_H
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    int doubler(int a);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif // MYFUNCTS_H
    

    【讨论】:

    • 好东西,不敢相信这以前没有咬过我。一位同事说您可以使用 -std=c99 (使用 ansi-c 文件)强制 g++ 构建兼容的目标文件。不过我没有在这里尝试。
    【解决方案3】:

    我遇到了一个非常相似的问题:我通过将 extern "C" 放在 .cpp 文件中的包含周围来解决它,因为此处发布的其他方法似乎不起作用。

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QTimer>
    
    extern "C" {
    #include "file.h"
    #include "other_file.h"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      相关资源
      最近更新 更多