У меня возникли проблемы с конфигурацией cmake для создания простой программы, которая опирается на файлы заголовков readline. Как отказ от ответственности я очень новичок в cmake.Библиотека cmake и readline в c-программе
Простая программа с я написал это:
#include<stdlib.h>
#include<stdio.h>
#include<readline/readline.h>
#include<readline/history.h>
int main(int argc, char* argv[])
{
char prompt[] = "user> ";
char* lineinput;
int i = 0;
while(1)
{
lineinput = readline(prompt);
add_history(lineinput);
printf("[%i] %s\n",i, lineinput);
free(lineinput);
i++;
}
return 0;
}
я могу скомпилировать это просто отлично с gcc repl.c -Wall -lreadline -o srepl.c
. Поэтому я знаю, что я установил пакет readline-dev
просто отлично с apt-get
. Я удаляю свой исполняемый файл и создаю каталог build
и cd
. Корневой каталог дерева проекта теперь выглядит
-> tree
.
|- build
|- CMakeLists.txt
|- repl.c
CMakeLists.txt
файл я написал, и я пытаюсь использовать это:
cmake_minimum_required(VERSION 2.8.12)
project(srepl)
set(CMAKE_VERBOSE_MAKEFILE on)
include_directories(/usr/include/readline)
file(GLOB SOURCES "./*.c")
set(CMAKE_C_FLAGS "-std=c99 -Wall -lreadline")
add_executable(srepl ${SOURCES})
В каталоге build
я бегу cmake
, а затем make
. Я получаю следующий вывод:
╰─⇀ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/g++
-- Check for working CXX compiler: /usr/bin/g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jesse/Public/simplerepl/build
╰─⇀ make
/usr/bin/cmake -H/home/jesse/Public/simplerepl -B/home/jesse/Public/simpl
erepl/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/jesse/Public/simplerepl/buil
d/CMakeFiles /home/jesse/Public/simplerepl/build/CMakeFiles/progress.mark
s
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory `/home/jesse/Public/simplerepl/build'
make -f CMakeFiles/srepl.dir/build.make CMakeFiles/srepl.dir/depend
make[2]: Entering directory `/home/jesse/Public/simplerepl/build'
cd /home/jesse/Public/simplerepl/build && /usr/bin/cmake -E cmake_depends
"Unix Makefiles" /home/jesse/Public/simplerepl /home/jesse/Public/simple
repl /home/jesse/Public/simplerepl/build /home/jesse/Public/simplerepl/bu
ild /home/jesse/Public/simplerepl/build/CMakeFiles/srepl.dir/DependInfo.c
make --color=
Scanning dependencies of target srepl
make[2]: Leaving directory `/home/jesse/Public/simplerepl/build'
make -f CMakeFiles/srepl.dir/build.make CMakeFiles/srepl.dir/build
make[2]: Entering directory `/home/jesse/Public/simplerepl/build'
/usr/bin/cmake -E cmake_progress_report /home/jesse/Public/simplerepl/bui
ld/CMakeFiles 1
[100%] Building C object CMakeFiles/srepl.dir/repl.c.o
/usr/bin/gcc -std=c99 -Wall -lreadline -I/usr/include/readline -o CM
akeFiles/srepl.dir/repl.c.o -c /home/jesse/Public/simplerepl/repl.c
Linking C executable srepl
/usr/bin/cmake -E cmake_link_script CMakeFiles/srepl.dir/link.txt --verbo
se=1
/usr/bin/gcc -std=c99 -Wall -lreadline CMakeFiles/srepl.dir/repl.c.o
-o srepl -rdynamic
CMakeFiles/srepl.dir/repl.c.o: In function `main':
repl.c:(.text+0x3e): undefined reference to `readline'
repl.c:(.text+0x4e): undefined reference to `add_history'
collect2: error: ld returned 1 exit status
make[2]: *** [srepl] Error 1
make[2]: Leaving directory `/home/jesse/Public/simplerepl/build'
make[1]: *** [CMakeFiles/srepl.dir/all] Error 2
make[1]: Leaving directory `/home/jesse/Public/simplerepl/build'
make: *** [all] Error 2
Так я вижу, что он не видит, где мои readline
заголовочных файлов. Я даже включил, где каталог, в котором он находится, с функцией include_directories()
, которой я не был связан с простым вызовом gcc
.
Любые указатели здесь с пояснениями или соответствующими разделами документации были бы полезными. Я действительно хочу узнать, как привести cmake в свой рабочий процесс.
Я тоже на Xubuntu 14.04.
Благодаря
Ого спасибо за молнии быстрый ответ! Тогда мне не нужно использовать команду 'include_directories()'? – Jesse
include_directories может не понадобиться, поскольку файл заголовка присутствует в стандартном местоположении. – user1969104