【问题标题】:Transforming makefile to cmake将makefile转换为cmake
【发布时间】:2015-09-24 13:09:05
【问题描述】:

我正在使用 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'

【问题讨论】:

  • 这不是 CMake 的正确语法。你宁愿使用target_link_libraries(Desktop gsl gslcblas m)。如果您坚持使用变量,那么您还需要手动设置 CMAKE_EXE_LINKER_FLAGS

标签: c++ makefile cmake gsl clion


【解决方案1】:

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

使用 CMake,您需要在 add_executable 之后添加这一行:

target_link_libraries(Desktop gsl gslcblas m)

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

删除编辑 CXX_FLAGS 所在的行。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-15
      • 2013-09-11
      • 2017-02-10
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多