我正在学习如何在这个课程中使用cmake,但文档非常冗长和密集。许多教程要么太简单而无法使用(仅使用一个文件进行cmake)或太复杂。
项目的原始Makefile如下所示:
# Some optimization settings
# see: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
# Standard all target
all: hw1_p2
# Simple program to do brute-force k-nearest neighbor searches against a signature file
hw1_p2: prob2.o ParseRecord.o Sorter.o Timing.o
g++ -o hw1_p2 prob2.o ParseRecord.o Sorter.o Timing.o
prob2.o: prob2.cpp utility_templates.hpp
g++ -Wall -c prob2.cpp
ParseRecord.o: ParseRecord.cpp ParseRecord.hpp utility_templates.hpp
g++ -Wall -c ParseRecord.cpp
Sorter.o: Sorter.cpp Sorter.hpp
g++ -Wall -c Sorter.cpp
# Timing class
Timing.o: Timing.hpp Timing.cpp
g++ -Wall -c Timing.cpp
# Clean code-derived files
clean:
rm -f *.o hw1_p2
项目的组织方式如下
到目前为止,从我所做的阅读中我明白你需要在每个目录中都有一个CMakelists.txt文件。 构建文件夹在那里,以便我可以进入它并运行cmake ..
在顶级的CMakelists.txt文件中我有
cmake_minimum_required (VERSION 2.6)
project (CMAKETEST)
add_subdirectory(src)
在src目录中,CMakelist.txt是我的尝试:
include_directories(${CMAKETEST_SOURCE_DIR}/src)
link_directories(${CMAKETEST_BINARY_DIR}/src)
add_executable(hw1_p2 prob2.cpp ParseRecord.cpp Sorter.cpp Timing.cpp)
我甚至不知道从哪里开始。 这个教程的评论几乎总结了我对cmake和文档的看法:
不够详细,不够有用。话虽如此,我不喜欢CMake 无论如何;你需要知道的太多独立,随意的事情。在 至少这是我的印象。比如'add_definitions(-std = c99)'。真? 这个名称是否会向您推断如何向编译器添加标志?和 “设置(VAR a b c)”是否比VAR = a b c或某些更直观? Beh在文章上,在CMake上。但我知道CMake正在接受 风暴建设世界。
尽管如此,我真的很想学习并弄清楚这一点,所以你能提供的任何帮助都会非常感激和乐于助人。提前谢谢。
答案 0 :(得分:4)
您不必在每个子目录中创建cmakelists.txt文件。对于一个简单的项目,它应该足以将所有内容放入顶层cmakelists.txt
cmake_minimum_required (VERSION 2.6)
project (CMAKETEST C CXX)
add_executable(hw1_p2 src/prob2.cpp src/ParseRecord.cpp src/Sorter.cpp src/Timing.cpp)
这个简单的cmakelists.txt应该完成工作。
答案 1 :(得分:2)
add_executable
命令用于构建可执行文件,但您似乎也尝试使用它来构建对象(.o
)文件。由于您只构建一个可执行文件,因此只需要一个add_executable
命令:
add_executable(hw1_p2 prob2.cpp ParseRecord.cpp Sorter.cpp Timing.cpp)