2015-10-31 1 views
2

У меня возникли проблемы с конфигурацией 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.

Благодаря

ответ

2

Вам нужно сделать target_link_libraries после add_executable, как показано ниже

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 "${CMAKE_C_FLAGS} -std=c99 -Wall") 
add_executable(srepl ${SOURCES}) 
target_link_libraries(srepl readline) 
+0

Ого спасибо за молнии быстрый ответ! Тогда мне не нужно использовать команду 'include_directories()'? – Jesse

+0

include_directories может не понадобиться, поскольку файл заголовка присутствует в стандартном местоположении. – user1969104