c程序中的cmake和readline库

Cmake and readline library in c program

我在获取 cmake 配置以构建依赖于 readline 头文件的简单程序时遇到了一些问题。作为免责声明,我对 cmake 很陌生。

我写的简单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 编译它。所以我知道我用 apt-get 安装了 readline-dev 包。 我删除了我的可执行文件并创建了一个 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 上。

谢谢

您需要在 add_executable 之后执行 target_link_libraries,如下所示

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)