【发布时间】:2014-09-10 15:28:05
【问题描述】:
由于 CLion 发布,我想从 make 迁移到 CMake。
所以我有一堆.cpp 和.hpp 文件的源文件夹和一个main.cpp 使用上面源代码的类 - 到目前为止,我有简单的Makefile 来编译、链接和使用main.cpp 执行执行:
C_OBJS := $(shell find source/*/ -name '*.cpp')
SOURCES=source/main.cpp $(C_OBJS)
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=bin/main
$(EXECUTABLE_T): $(OBJECTS_T)
$(CC) $(LDFLAGS) $(OBJECTS_T) -o $@
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
%.o: %.cpp
$(CC) $(CFLAGS) $< -c -o $@
all: $(EXECUTABLE)
在 Cmake 中,我遇到了这样的事情:
cmake_minimum_required(VERSION 2.8.4)
project(Main)
#grab all file we need to compile
file(GLOB SRC
"source/*.h"
"source/*.hpp"
"source/*.cpp"
)
#compile to .o files all we need
add_library( myLib ${SRC} )
set(SOURCE_FILES source/main.cpp)
#compile to .o main.cpp
add_executable( Main ${SOURCE_FILES} )
#link them all
target_link_libraries( Main myLib )
但是我在链接时不断获得对所有类的“未定义引用”,并且通过编译时间判断感觉并不是所有内容都已编译。你能帮忙吗? :)
【问题讨论】:
-
如果您的
source目录有一些子文件夹,您可能应该使用file(GLOB_RECURSE ...而不是file(GLOB ... -
另外,您的
source/main.cpp文件将被编译成myLib。这是理想的行为吗? -
啊……现在可以了!对不起,我认为它默认是递归的。非常感谢 :) 不,
main.cpp不在source- 抱歉笨拙的复制粘贴。 -
我们不建议使用 GLOB 从源代码树中收集源文件列表。如果在添加或删除源时没有 CMakeLists.txt 文件发生更改,则生成的构建系统无法知道何时要求 CMake 重新生成。 - 引用 the CMake manual。