From Makefile to Cmake

From Makefile to Cmake

本文关键字:Cmake to Makefile From      更新时间:2023-10-16

由于CLion的发布,我想从make转到CMake。因此,我有一个源文件夹,里面有一堆.cpp.hpp文件,还有一个main.cpp,里面有来自上面源代码的use类——到目前为止,我已经有了一个简单的Makefile来编译、链接和制作来自main.cpp:的exec

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 )

但我在链接时不断得到对所有类的"未定义引用",根据编译时间判断,感觉并不是所有的东西都编译好了。你能帮忙吗?:)

尝试将库设置为静态库,而不是共享库。

add_library( myLib STATIC ${SRC} )

否则,默认情况下会得到一个共享库,这需要正确的导出宏。

如果没有导出宏,库中的符号(例如方法)将不会导出,因此在链接时不可用。正确的导出宏对于Windows上的共享库总是必要的,并且对于Unix上的共享库当设置了-fvisibility=hidden时也是必要的,通常情况就是这样。

此外,正如其他人所说,不要使用GLOB,而是根据http://www.cmake.org/cmake/help/v3.0/command/file.html.但这是一个很好的做法,与实际的链接错误无关。