【问题标题】:undefined reference to c header file's对 c 头文件的未定义引用
【发布时间】:2020-11-23 05:08:28
【问题描述】:

我想制作一个用于测试的库,为此,我想制作一个只返回一些 char* 的 c 程序。我是基于cmake 构建的。这是我的 cmake 文件:

cmake_minimum_required(VERSION 2.8)
project(smc)
add_executable(${PROJECT_NAME} "main.c" "info.cpp")
target_link_libraries(${PROJECT_NAME}
    -lssh
    )
set(HDRS
    ${NMEA_HDRS}
    info.h
    )

标题:

#ifndef INFO_H
#define INFO_H

int sshConnection();
char* getcpuusage();

#endif // INFO_H

来源:

#include "info.h"
#include <libssh/libssh.h>
#include <stdio.h>
int sshConnection()
{
    ssh_session my_ssh_session = ssh_new();
    const void* ip = "localhost";
    if( my_ssh_session == NULL ) {
            printf( "Error creating ssh session" );
            return 1;
    }
    ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "localhost");
    ssh_options_set(my_ssh_session, SSH_OPTIONS_USER, "heydari.f");
    int rc = ssh_connect(my_ssh_session);
    if( rc != SSH_OK ) {
            printf("Error with connecting" );
            ssh_free(my_ssh_session);
            return -1;
    }

    rc = ssh_userauth_password(my_ssh_session, NULL, "heydari@linux");
    if( rc != SSH_AUTH_SUCCESS) {
            printf("Error with authorization %c " , ssh_get_error(my_ssh_session) );
            ssh_disconnect(my_ssh_session);
            ssh_free(my_ssh_session);
            return -1;
    }

}
char *getcpuusage()
{
    sshConnection();
    char * usage = "44%";
    return usage;
}

当我在 main.cpp 中使用这个头文件时:

#include <stdio.h>
#include "info.h"
int main()
{
    char* f = getcpuusage();
    return 0;
}

我收到了这个错误:

.../projects/smc/smc/main.c:-1: error: undefined reference to `getcpuusage'

我做 cmake 有错吗?

【问题讨论】:

  • 我编辑了对 Qt 的引用,因为这个问题似乎根本不包含任何与 Qt 相关的内容。也许您正在使用 Qt Creator 构建非 Qt 项目? Qt Creator 只是一个 IDE(即使它有很多 Qt 开发的功能),而 Qt 是一个框架,您可以使用几乎任何 IDE 或代码编辑器进行开发,而不仅仅是 Qt Creator。
  • 是的,我正在使用 qt creator 来构建我的项目。谢谢。 @hyde

标签: c++ c cmake undefined-reference


【解决方案1】:

首先,错误信息来自链接器,它没有找到符号getcpuusage

原因是,您的 info.cpp 是 C++ 源文件,而 main.c 是 C 源文件。默认情况下(例如允许函数重载)C++ 对所有 C++ 函数都调用 name-mangling,基本上将函数名称与其参数类型结合起来创建符号名称(这对人类来说看起来很混乱和混乱)。源文件的文件名很重要,因为 cmake 决定了如何从中编译文件,因此在这种情况下,它使用 C 编译器编译一个,而另一个使用 C++ 编译器编译。

有3种直接解决方案:

  1. 仅使用 C++,换句话说,将 main.c 重命名为 main.cpp。在这种情况下,最好使用 C++ 头文件和库,因此也不要使用 stdio.h,而是更喜欢 C++ 库。

  2. 仅使用 C,换句话说,将 info.cpp 重命名为 info.c(并从中删除任何 C++ 代码,但在这种情况下它没有任何)。

  3. 告诉 C++ 编译器不要进行名称修改。这可以在声明函数时使用extern "c" 来完成(然后你不能使用重载):

info.h:


#ifndef INFO_H
#define INFO_H

#ifdef __cplusplus
// when included in C++ file, let compiler know these are C functions
extern "C" {
#endif

int sshConnection();
char* getcpuusage();

#ifdef __cplusplus
}
#endif

#endif // INFO_H

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2012-02-02
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多