【发布时间】:2015-10-31 13:00:24
【问题描述】:
我在获取 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 上。
谢谢
【问题讨论】: