如何从现有的生成文件创建 CMake 文件?
How to create a CMake file from an existing Makefile?
我正在尝试将我的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中,当我单击"构建"按钮时,我看到"构建目标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 程序,就好像我没有修改主文件中的任何内容.cpp一样。
不要像这样在 CMake 中手动设置编译标志。
相反,请使用相应的 CMake 功能来实现这些标志应该执行的操作:
-O0
优化级别通常由CMAKE_BUILD_TYPE
决定。请注意,这是用户在调用 CMake 时将设置的变量,因此您应该只在CMakeLists.txt
中读取该变量。-c
CMake 正确分离编译和链接步骤,但永远不要传递此选项。-m64
计算机类型由所使用的编译器(用于 Makefiles)或生成器(在 Visual Studio 上)确定。如果需要手动选择其他计算机类型,则需要工具链文件。除非您进行交叉编译,否则几乎可以肯定您只想跳过此选项。-fPIC
这是通过设置POSITION_INDEPENDENT_CODE
目标属性来完成的。您还可以通过设置CMAKE_POSITION_INDEPENDENT_CODE
变量为所有目标全局设置此项。-DNDEBUG
这再次根据CMAKE_BUILD_TYPE
自动设置。-DIL_STD
使用target_compile_definitions
设置预处理器定义。-stdlib=libc++"
首先确保你确实需要这个。这又是一个依赖于工具链的选项,并且高度依赖于构建环境。因此,您至少需要将其转义到生成器表达式后面,以确保仅针对其适用的工具链调用它。您甚至可以考虑将其移动到工具链文件中。
综上所述:从Makefiles到CMake的1:1转换并不容易。
这两个系统的范围大不相同,使用完全不同的习语。特别是,CMake 需要可移植到许多底层构建系统,因此 CMake 不支持 make 可以使用的许多快捷方式。例如,您使用的link_directories
方法在CMake中通常是一个非常糟糕的主意。在继续之前,请确保您首先熟悉 CMake 如何执行这些操作。
- 终端不会为C++文件创建.exe文件吗
- 如何从具有两列的.txt文件创建并行数组?
- 从 .lib 文件创建一个.dll文件
- 如何从输入文件 c++ 创建随机名称生成器
- 无法从 cso 文件创建顶点着色器(从 fx 文件创建)
- 如何为多个目录中的多个文件创建生成文件?
- 在编译时从 c++ 文件创建枚举
- 如何在运行时从 c++ 中的 DLL 文件创建对象?
- 文件创建并不总是成功
- 如何使用 QFile、c++ 从文件创建整数数组
- 是否可以在编译后创建 CMake 目标和文件目录?
- 您可以使用 makefile 从 .o 对象文件创建 C++ 文件吗?
- 从函数中的dat文件创建一个2维数组
- 无法为编译 SFML 项目创建 cmake 规则
- 如何为 cpp 和 h 文件创建别名(并忽略编译器__attributes__)
- 如何从现有的生成文件创建 CMake 文件?
- 如何为 VxWorks 创建 CMake 交叉编译工具链?
- 为什么我无法使用文本文件创建文件映射?
- 通过读取文件创建映射<字符串,矢量>时如何管理内存<string>
- 如何为模块化项目正确创建 CMake 文件