如何从现有的Makefile创建CMake文件?

时间:2018-01-12 17:12:49

标签: c++ macos makefile cmake clion

我正在尝试将我的C ++代码迁移到Mac OSX上的CLion,但我是CMake的新手。我有一个C ++代码,已在Eclipse中测试并成功运行。特别是,我通过根据以下Makefile设置项目属性来创建Eclipse项目。

SYSTEM     = x86-64_osx
LIBFORMAT  = static_pic

CPLEXDIR = /Users/soheilmn/Applications/IBM/ILOG/CPLEX_Studio1271
CONCERTDIR = /Users/soheilmn/Applications/IBM/ILOG/CPLEX_Studio1271/concert

# ---------------------------------------------------------------------
# Compiler selection 
# ---------------------------------------------------------------------
CCC = clang++ -O0


# ---------------------------------------------------------------------
# Compiler options 
# ---------------------------------------------------------------------
CCOPT = -m64 -O -fPIC -fexceptions -DNDEBUG -DIL_STD -stdlib=libc++

# ---------------------------------------------------------------------
# Link options and libraries
# ---------------------------------------------------------------------

CPLEXBINDIR   = $(CPLEXDIR)/bin/$(BINDIST)
CPLEXLIBDIR   = $(CPLEXDIR)/lib/$(SYSTEM)/$(LIBFORMAT)
CONCERTLIBDIR = $(CONCERTDIR)/lib/$(SYSTEM)/$(LIBFORMAT)

CCLNDIRS  = -L$(CPLEXLIBDIR) -L$(CONCERTLIBDIR)
CCLNFLAGS = -lconcert -lilocplex -lcplex -m64 -lm -lpthread -framework CoreFoundation -framework IOKit -stdlib=libc++

all:
    make all_cpp
execute: all
    make execute_cpp

CONCERTINCDIR = $(CONCERTDIR)/include
CPLEXINCDIR   = $(CPLEXDIR)/include

CCFLAGS = $(CCOPT) -I$(CPLEXINCDIR) -I$(CONCERTINCDIR) 

这是我到目前为止为CMakeLists.txt文件创建的内容。

cmake_minimum_required(VERSION 3.9)
project(SFCNF CXX)
set(CMAKE_CXX_STANDARD 11)

include_directories(/Users/soheilmn/Applications/IBM/ILOG/CPLEX_Studio1271/cplex/include)
include_directories(/Users/soheilmn/Applications/IBM/ILOG/CPLEX_Studio1271/concert/include)

set(CMAKE_CXX_FLAGS "-O0 -c -m64 -fPIC  -DNDEBUG -DIL_STD -stdlib=libc++")

link_directories("/Users/soheilmn/Applications/IBM/ILOG/CPLEX_Studio1271/concert/lib/x86-64_osx/static_pic")
link_directories("/Users/soheilmn/Applications/IBM/ILOG/CPLEX_Studio1271/cplex/lib/x86-64_osx/static_pic")

add_executable(SFCNF "/Users/soheilmn/CLionProjects/SFCNF/main.cpp")

target_Link_Libraries(SFCNF "-lconcert -lilocplex -lcplex -m64 -lm -lpthread -framework CoreFoundation -framework IOKit -stdlib=libc++")

在CLion中,当我点击“Build”按钮时,我看到“Built target SFCNF”消息(带有一些警告)。但是,当我运行程序时,我看到以下消息:

“找不到文件:/ Users / soheilmn / CLionProjects / SFCNF / cmake-build-debug / SFCNF”

有谁能告诉我这里缺少什么?谢谢!

更新:我编辑了我的CMake文件,如下所示。

cmake_minimum_required(VERSION 3.9)
project(SFCNF CXX)
set(CMAKE_CXX_STANDARD 11)
add_executable(SFCNF main.cpp)

使用简单的Hello World程序,我的C ++代码现在可以在CLion中运行。但是,当我设置如下的编译器选项时

cmake_minimum_required(VERSION 3.9)
project(SFCNF CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "-O0 -c -m64 -fPIC  -DNDEBUG -DIL_STD -stdlib=libc++")
add_executable(SFCNF main.cpp)

CLion会发出如下警告。

/Applications/CLion.app/Contents/bin/cmake/bin/cmake --build /Users/soheilmn/CLionProjects/SFCNF/cmake-build-debug --target SFCNF -- -j 2

[ 50%] Linking CXX executable SFCNF
clang: warning: -Wl,-search_paths_first: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: -Wl,-headerpad_max_install_names: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: CMakeFiles/SFCNF.dir/main.cpp.o: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-O0' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-fPIC' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-D NDEBUG' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-D IL_STD' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-stdlib=libc++' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-g' [-Wunused-command-line-argument]
[100%] Built target SFCNF

此外,现在如果我修改我的程序以打印另一条消息,CLion会继续运行上一个Hello World程序,就像我没有修改main.cpp文件中的任何内容一样。

1 个答案:

答案 0 :(得分:1)

不要像那样在CMake中手动设置编译标志。

相反,使用相应的CMake功能来实现那些应该执行的标记:

  • -O0优化级别通常由CMAKE_BUILD_TYPE确定。请注意,这是一个由用户在调用CMake时设置的变量,因此您只能从CMakeLists.txt中的该变量读取
  • -c CMake正确地分离了编译和链接步骤,只是从不传递此选项。
  • -m64机器类型由正在使用的编译器(对于Makefile)或生成器(在Visual Studio上)确定。如果您需要手动选择其他机器类型,则需要toolchain file。除非您进行交叉编译,否则您几乎肯定只想跳过此选项。
  • -fPIC这是通过设置POSITION_INDEPENDENT_CODE目标属性来完成的。您还可以通过设置CMAKE_POSITION_INDEPENDENT_CODE变量为所有目标全局设置此项。
  • -DNDEBUG这会根据CMAKE_BUILD_TYPE
  • 自动设置
  • -DIL_STD使用target_compile_definitions设置预处理器定义。
  • -stdlib=libc++"首先要确保你确实需要这个。这又是一个工具链依赖选项,并且高度依赖于构建环境。因此,您希望至少在generator expression后面将其转义,以确保仅针对适用的工具链调用它。您甚至可以考虑将其移动到工具链文件中。

所有这些都说:从Makefile到CMake 没有简单的1:1转换。

两个系统的范围大不相同,使用完全不同的习语。特别是,CMake需要可移植到许多底层构建系统,因此CMake不支持许多可以使用的快捷方式。例如,您使用的link_directories方法是usually a really bad idea in CMake。在开始之前,请务必先熟悉CMake如何处理这些事情。