[英]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.