C++ 将makefile转换为cmake

C++ 将makefile转换为cmake,c++,makefile,cmake,gsl,clion,C++,Makefile,Cmake,Gsl,Clion,我正在使用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) $(CXXFLAG

我正在使用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
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})
undefined reference to `gsl_rng_env_setup'
然后我想用Clion调试我的代码,但是我在构建它时遇到了问题。CMakeList如下所示:

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
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})
undefined reference to `gsl_rng_env_setup'
关于gsl,几乎没有错误,它们如下所示:

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
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})
undefined reference to `gsl_rng_env_setup'

CMAKE_CXX_标志仅从.cpp传递到compile.o,但要链接的库应传递到链接阶段(从.o编译可执行文件/lib)。
使用target_link_libraries()函数执行此操作。

CMAKE_CXX_标志仅从.cpp传递到compile.o,但要链接的库应传递到链接阶段(从.o编译可执行文件/lib)。 使用target_link_libraries()函数执行此操作。

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

使用CMake,您需要在add_可执行文件之后添加此行:

目标链接库(桌面gsl gslcblas m)

请注意,在CMake中,在列出LIB时不使用“-l”

删除编辑CXX_标志所在的行。

“未定义引用”是链接器错误。 您忘记了链接Makefile中使用的库

使用CMake,您需要在add_可执行文件之后添加此行:

目标链接库(桌面gsl gslcblas m)

请注意,在CMake中,在列出LIB时不使用“-l”


删除编辑CXX_标志所在的行。

这不是CMake的正确语法。您更愿意使用
target\u link\u库(桌面gsl gslcblas m)
。如果您坚持使用变量,则还需要手动设置
CMAKE\u EXE\u LINKER\u标志。这不是CMAKE的正确语法。您更愿意使用
target\u link\u库(桌面gsl gslcblas m)
。如果您坚持使用变量,那么还需要手动设置
CMAKE\u EXE\u LINKER\u标志。