gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:05:46 25 4
gpt4 key购买 nike

我正在尝试将我的 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 文件中的任何内容一样。

最佳答案

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

相反,使用相应的 CMake 功能来实现这些标志应该做的事情:

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

综上所述:从 Makefile 到 CMake 的 1:1 转换并不容易

这两个系统的范围截然不同,使用的习语也完全不同。特别是,CMake 需要移植到许多底层构建系统,因此 CMake 不支持许多 make 可以使用的快捷方式。例如,您使用的 link_directories 方法是 usually a really bad idea in CMake .在继续之前,请务必先熟悉 CMake 如何执行这些操作。

关于c++ - 如何从现有的 Makefile 创建 CMake 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48231004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com