将makefile转换为cmake

Transforming makefile to cmake

本文关键字:cmake 转换 makefile      更新时间:2023-10-16

我正在使用makefile运行一个程序,它看起来像这样:

CXX = g++
CXXFLAGS = -c -Wall -g -std=c++11 -I/usr/local/include
OBJS = main.o Integr.o Data.o Interpolate.o
all: main
main: $(OBJS)
    $(CXX) $(OBJS) -lgsl -lgslcblas -lm -o main
main.o: main.cpp
    $(CXX) $(CXXFLAGS) main.cpp
Integr.o: Integr.cpp
    $(CXX) $(CXXFLAGS) Integr.cpp
Data.o: Data.cpp
    $(CXX) $(CXXFLAGS) Data.cpp
Interpolate.o: Interpolate.cpp
    $(CXX) $(CXXFLAGS) Interpolate.cpp
clean:
    rm -f *.o

,然后我想用Clion调试我的代码,但是我在构建它时遇到了问题。CMakeList看起来像这样:

cmake_minimum_required(VERSION 3.3)
project(Desktop)
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_CXX_FLAGS "-o -g -std=c++11 -lgsl -lgslcblas -lm")
add_definitions(${CMAKE_CXX_FLAGS})
include_directories(-I/usr/local/include)
set(SOURCE_FILES
    Data.cpp
    Data.h
    Integr.cpp
    Integr.h
    Interpolate.cpp Interpolate.h main.cpp)
add_executable(Desktop ${SOURCE_FILES})

有一些错误,关于gsl,他们看起来像这样:

undefined reference to `gsl_rng_env_setup'

"未定义的引用"是一个链接错误。您忘记链接您在Makefile中使用的库了。

使用CMake,你需要在add_executable后面添加这一行:

target_link_libraries(Desktop gsl gslcblas m)

请注意,在CMake中列出库时不要使用"-l"。

删除编辑CXX_FLAGS的行

CMAKE_CXX_FLAGS只传递给从.cpp编译。o,但是您想要链接的库应该传递给链接阶段(从。o编译可执行文件/lib)。使用target_link_libraries()函数来完成此操作。