2015-09-24 2 views
0

я запустить программу, используя Makefile и это выглядело так:Преобразование Makefile в CMake

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' 
+0

Это не правильный синтаксис для CMake. Вы предпочли бы использовать 'target_link_libraries (Desktop gsl gslcblas m)'. Если вы будете придерживаться своих переменных, вам также понадобится установить 'CMAKE_EXE_LINKER_FLAGS' вручную. – mistapink

ответ

2

"undefinied reference" - ошибка компоновщика. вы забыли связать библиотеки, которые вы использовали в Makefile.

Использование CMake вы должны добавить эту строку после add_executable:

target_link_libraries(Desktop gsl gslcblas m)

Обратите внимание, что в CMake вы не используете "-l" при перечислении LIBS.

Удалите строку, где вы редактируете CXX_FLAGS.

2

CMAKE_CXX_FLAGS передается только для компиляции .o из .cpp, но библиотеки, которые вы хотите ссылка должна быть передана на фазу связи (для компиляции исполняемого файла/lib из .o). Используйте функцию target_link_libraries() для этого.

Смежные вопросы