[英]I am trying to translate an existing Makefile to a CMakeLists.txt but the compiled project results in a Segfault
我正在嘗試使用 CMake 而不是給定的 Makefile 來構建項目。 我需要這樣做,因為我想通過 Julias CxxWrap 包裝 C++ 代碼,它還有一個使用 CMake 的構建配方。 但是我不確定如何正確翻譯所有編譯器標志等。
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):
我嘗試做“同樣的事情,但通過 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)
我知道這仍然是完成的好方法,但我是一個合適的 C++ 菜鳥,任何幫助將不勝感激!
c++ 項目在 github 上可用:[https://github.com/pkoehl/AlphaMol] 提前致謝
弗拉德
我最終得到了以下 CMake 文件,它完成了工作。 請注意,我現在正在構建一個共享庫。 此外,我實際上沒有指定任何編譯器標志。 最后,這只是鏈接正確庫的問題。
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.