неопределенная ссылка на c заголовочный файл - PullRequest
1 голос
/ 03 августа 2020

Я хочу создать библиотеку для тестирования, и для этой цели я хочу создать программу c, которая просто возвращает некоторые char*. Я построил его на основе 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
    )

header:

#ifndef INFO_H
#define INFO_H

int sshConnection();
char* getcpuusage();

#endif // INFO_H

source:

#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;
}

когда я использую этот файл заголовка в своем основном файле. 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?

1 Ответ

0 голосов
/ 03 августа 2020

Прежде всего, сообщение об ошибке исходит от компоновщика, он не находит символ getcpuusage.

Причина этого в вашей информации. cpp - это исходный код на C ++ файл, а main. c - C исходный файл. По умолчанию (чтобы разрешить, например, перегрузку функций) C ++ выполняет так называемое изменение имени для всех функций C ++, в основном комбинируя имя функции с ее типами параметров для создания имени символа (которое выглядит искаженным и беспорядочным для человека) . Имена ваших исходных файлов имеют значение, потому что 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...