简体   繁体   English

我正在尝试将现有的 Makefile 转换为 CMakeLists.txt,但编译的项目会导致 Segfault

[英]I am trying to translate an existing Makefile to a CMakeLists.txt but the compiled project results in a Segfault

I am trying to build a project using CMake instead of a given Makefile.我正在尝试使用 CMake 而不是给定的 Makefile 来构建项目。 I need to do this since I want to wrap the C++ Code via Julias CxxWrap, which also has a build recipe using CMake.我需要这样做,因为我想通过 Julias CxxWrap 包装 C++ 代码,它还有一个使用 CMake 的构建配方。 However I am not sure how to get all the compiler flags and so on translated properly.但是我不确定如何正确翻译所有编译器标志等。

The Makefile is the following: Makefile如下:

     ================= Libraries and Includes ====================================

INOUT_INCLUDE_DIR = ./InOut/include
STRUCT_INCLUDE_DIR = ./DataStruct/include
DELCX_INCLUDE_DIR = ./Delcx/include
ALFCX_INCLUDE_DIR = ./Alphacx/include
VOLUMES_INCLUDE_DIR = ./Volumes/include

INCLUDE_DIRS = -I$(INC_DIR) -I$(INOUT_INCLUDE_DIR) -I$(STRUCT_INCLUDE_DIR)\
        -I$(DELCX_INCLUDE_DIR) -I$(ALFCX_INCLUDE_DIR) -I$(VOLUMES_INCLUDE_DIR)
GMP_LIB_DIR =
LIB_DIRS =

GMP_LIBS = -lgmp
LIBS = $(GMP_LIBS) -lstdc++

# ================= Project Directories ====================================

INC_DIR = ./project/include
SRC_DIR = ./project/src
OBJ_DIR = ./project/src
BIN_DIR = ./bin

# ================= Project Name ===========================================

EXT=
NAME=AlphaMol
NAMEOBJ=$(OBJ_DIR)/$(NAME).o
NAMEBIN=$(BIN_DIR)/$(NAME)$(EXT)

# ================= Compilers and Flags ====================================

CPP         := g++
CPPFLAGS    := -c -O3 -Wdeprecated-declarations -Wuninitialized -ansi -Werror -Wunused -std=c++11

LOAD_LIB_PATH =

LD_FLAGS = -O3

# ================= Pattern rules ==========================================

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
    $(CPP) $(CPPFLAGS) $(INCLUDE_DIRS) $< -o $@

# ================= Compile source code ====================================

OBJECTS = \
$(NAMEOBJ)

# ================= Generate Executable ====================================

$(NAMEBIN) : $(OBJECTS)
    $(CPP) -o $(NAMEBIN) $(LD_FLAGS) $(OBJECTS) $(LIB_DIRS) $(LIBS) $(LOAD_LIB_PATH)

all: $(OBJECTS)
    $(CPP) -o $(NAMEBIN) $(LD_FLAGS) $(OBJECTS) $(LIB_DIRS) $(LIBS) $(LOAD_LIB_PATH)

clean:
    touch $(OBJ_DIR)/junk.o; rm -f $(OBJ_DIR)/*.o $(NAMEBIN)

$(OBJECTS):

My attempt at doing "the same thing but including CxxWrap via CMake looks like this:我尝试做“同样的事情,但通过 CMake 包括 CxxWrap 看起来像这样:

    project(AlphaMol)

cmake_minimum_required(VERSION 2.8.12)
set(CMAKE_MACOSX_RPATH 1)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -gdwarf-3")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")

#JLCXX
find_package(JlCxx)
get_target_property(JlCxx_location JlCxx::cxxwrap_julia LOCATION)
get_filename_component(JlCxx_location ${JlCxx_location} DIRECTORY)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;${JlCxx_location}")

message(STATUS "Found JlCxx at ${JlCxx_location}")

add_library(AlphaMol SHARED AlphaMol.cpp)

target_link_libraries(AlphaMol JlCxx::cxxwrap_julia)

#GMP
set(GMP_PREFIX "" CACHE PATH "path ")

find_path(GMP_INCLUDE_DIR gmp.h gmpxx.h
        PATHS ${GMP_PREFIX}/include /usr/include /usr/local/include )

find_library(GMP_LIBRARY NAMES gmp libgmp
        PATHS ${GMP_PREFIX}/lib /usr/lib /usr/local/lib)

if(GMP_INCLUDE_DIR AND GMP_LIBRARY)
    get_filename_component(GMP_LIBRARY_DIR ${GMP_LIBRARY} PATH)
    set(GMP_FOUND TRUE)
endif()

if(GMP_FOUND)
    if(NOT GMP_FIND_QUIETLY)
        MESSAGE(STATUS "Found GMP: ${GMP_LIBRARY}")
    endif()
elseif(GMP_FOUND)
    if(GMP_FIND_REQUIRED)
        message(FATAL_ERROR "Could not find GMP")
    endif()
endif()

target_link_libraries(AlphaMol ${GMP_LIBRARY})

target_include_directories(AlphaMol PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include>
        $<INSTALL_INTERFACE:../include>
        )

target_include_directories(AlphaMol PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../Alphacx/include>
        $<INSTALL_INTERFACE:/../../Alphacx/include>
        )

target_include_directories(AlphaMol PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../DataStruct/include>
        $<INSTALL_INTERFACE:/../../DataStruct/include>
        )

target_include_directories(AlphaMol PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../Delcx/include>
        $<INSTALL_INTERFACE:/../../Delcx/include>
        )

target_include_directories(AlphaMol PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../InOut/include>
        $<INSTALL_INTERFACE:/../../InOut/include>
        )

target_include_directories(AlphaMol PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../Volumes/include>
        $<INSTALL_INTERFACE:/../../Volumes/include>
        )

install(TARGETS
        AlphaMol
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib
        RUNTIME DESTINATION lib)

I understand that this is still a good way from being finished, but I am a proper C++ noob and any help would be greatly appreciated!我知道这仍然是完成的好方法,但我是一个合适的 C++ 菜鸟,任何帮助将不胜感激!

The c++ project is available on github: [https://github.com/pkoehl/AlphaMol] Thanks in advance c++ 项目在 github 上可用:[https://github.com/pkoehl/AlphaMol] 提前致谢

Vlad弗拉德

I ended up with the following CMake File which gets the job done.我最终得到了以下 CMake 文件,它完成了工作。 Note that I am now building a Shared library.请注意,我现在正在构建一个共享库。 Furthermore, I actually did not specify any compiler flags.此外,我实际上没有指定任何编译器标志。 In the end it was just a matter of linking the correct libraries.最后,这只是链接正确库的问题。

cmake_minimum_required(VERSION 3.1.0)
project(alphamol)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Try to find the GNU Multiple Precision Arithmetic Library (GMP)
find_path(GMP_INCLUDE_DIR gmp.h
    PATHS /usr/include /usr/local/include )

find_library(GMP_LIBRARY NAMES gmp
    PATHS /usr/lib /usr/local/lib)

if(GMP_INCLUDE_DIR AND GMP_LIBRARY)
    get_filename_component(GMP_LIBRARY_DIR ${GMP_LIBRARY} PATH)
    set(GMP_FOUND TRUE)
endif()

if(GMP_FOUND)
   if(NOT GMP_FIND_QUIETLY)
      MESSAGE(STATUS "Found GMP: ${GMP_LIBRARY}")
   endif()
elseif(GMP_FOUND)
   if(GMP_FIND_REQUIRED)
      message(FATAL_ERROR "Could not find GMP")
   endif()
endif()

# Include JLCxx
find_package(JlCxx)
get_target_property(JlCxx_location JlCxx::cxxwrap_julia LOCATION)
get_filename_component(JlCxx_location ${JlCxx_location} DIRECTORY)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;${JlCxx_location}")

message(STATUS "Found JlCxx at ${JlCxx_location}")

# AlphaMol includes
list(APPEND ALPHAMOL_INCLUDE_DIRS "DataStruct/include")
list(APPEND ALPHAMOL_INCLUDE_DIRS "Delcx/include")
list(APPEND ALPHAMOL_INCLUDE_DIRS "Alphacx/include")
list(APPEND ALPHAMOL_INCLUDE_DIRS "InOut/include")
list(APPEND ALPHAMOL_INCLUDE_DIRS "Volumes/include")
list(APPEND ALPHAMOL_INCLUDE_DIRS "project/include")


# build app
file(GLOB ALPHAMOL_SOURCE "project/src/*.cpp")
include_directories(${ALPHAMOL_INCLUDE_DIRS} ${GMP_INCLUDE_DIR})
add_library(AlphaMol SHARED ${ALPHAMOL_SOURCE})
target_link_libraries(AlphaMol gmp JlCxx::cxxwrap_julia)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM