неопределенная ссылка на переменную extern при использовании cmake - PullRequest
0 голосов
/ 30 октября 2018

У меня есть следующие файлы c.

prog1.h

#ifndef PROG1_H
#define PROG1_H
extern char* hello;
#endif

prog1.c

#include "prog1.h"

char *hello="hello";

one.c

#include "prog1.h"
#include <stdio.h>

int main(){

    printf("%s", hello);
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
project(tester)

add_executable(main one.c)
add_executable(prog1 prog1.c)

При попытке собрать проект "тестер" в KDevelop получаю следующий вывод.

выходной журнал, сгенерированный в KDevelop при создании проекта

Но когда я явно компилирую файл на терминале командой -

gcc one.c prog1.c -o выходной файл

возвращает мне «выходной файл», который при запуске -

. / Выходной_файл

я получаю желаемый результат

akash@Z50-70:~/projects/Tester$ gcc one.c prog1.c -o outputfile
akash@Z50-70:~/projects/Tester$ ./outputfile
hello
akash@Z50-70:~/projects/Tester$ 

Может кто-нибудь помочь мне с проблемой, с которой я столкнулся при попытке построить проект в KDevelop?

1 Ответ

0 голосов
/ 30 октября 2018

Это не связано с KDevelop. Это о вашем CMakeLists.txt. cmake используется в качестве менеджера проекта в KDevelop и CLion. Но ваш вопрос не относится к IDE.

Ошибка говорит о неопределенной ссылке на main, потому что вы компилируете prog1.c как исполняемый файл. и исполняемый файл должен иметь основную функцию. prog1.c не имеет его.

Вы добавляете два разных исполняемых файла. добавить два источника в один исполняемый файл.

add_executable(main one.c prog1.c)

Конечно, вы можете иметь несколько исполняемых файлов в одном проекте. Однако в общем случае имя проекта задается как имя исполняемого файла, если вы создаете только один исполняемый файл, если только у вас нет особых требований.

add_executable(tester one.c prog1.c)
...