软件环境

# 操作系统 = Windows10
# 编译链工具 =
# gcc, g++, GNU Fortran (MinGW.org GCC Build-2) 9.2.0
# GNU Make 3.82.90 Built for i686-pc-mingw32
# GNU ld (GNU Binutils) 2.32
# CMake version 3.18.1

本机安装了MinGW编译工具,并将<安装路径>\MinGW\bin添加到环境变量中。

Windows下CMake编译配置

设置项目的generator

在本机使用CMake过程中发现,默认使用NMake Makefiles作为generator,因为没有安装因此配置失败。

希望设置generator为已安装的MinGW Makefiles

Command Line

cmake .. -G "MinGW Makefiles"

CMake GUI

初次Configure时指定项目的generator。

选用MinGW Makefiles,使用默认编译器。

如果已经指定generator后,需要修改。可以清除CMake Cache后再次ConfigureFile->Delete Cache

PreLoad.cmake

CMake设置generator是在处理CMakeLists.txt之前的,因此不能通过在CMakeLists.txt中设置CMAKE_GENERATOR达到修改默认generator的作用。

可以在项目根目录添加PreLoad.cmake这样的文件实现预先修改配置,内容如下。

set(CMAKE_GENERATOR "MinGW Makefiles" CACHE INTERNAL "" FORCE)

设置make

即使已为MinGW添加了环境变量,但是不能在命令行中直接使用make。gcc、g++、gfortran可以直接使用。

是因为在<安装路径>\MinGW\bin下,对应make的可执行程序名字为mingw32-make,在同目录下拷贝一份,重命名为make即可使用。

示例程序

CMake

以下为CMakeLists.txt文件内容,

# name: exe_test
# date: 2021/3/14
# cmake_minimum_required(VERSION 3.3)
project(exe_test CXX Fortran) add_executable(hello source/hello.cpp)
add_executable(caller_cpp source/caller.cpp)
add_executable(caller_fort source/caller.f90)

设置Fortran语言的一个小问题

-->$ cmake ..
-- The CXX compiler identification is GNU 9.3.0
CMake Error: Could not find cmake module file: CMakeDetermineFORTRANCompiler.cmake
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_FORTRAN_COMPILER_ENV_VAR
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_FORTRAN_COMPILER
...

这个问题的原因在CMakeLists.txt中,是大小写敏感的,Fortran只应该使用首字母大写的形式。

# project(exe_test CXX FORTRAN)
project(exe_test CXX Fortran)

source/hello.cpp

// name: hello.cpp
// date: 2021/3/14
// #include <iostream>
using namespace std; int main()
{
cout << "Aloha!" << endl; return 0;
}

source/caller.cpp

// name: caller.cpp
// date: 2021/3/14
// #include <iostream>
#include <string>
#include <Windows.h>
#include <tlhelp32.h>
#include <process.h> using namespace std; void Launch(LPCTSTR lpApplicationName)
{
// additional information
STARTUPINFO si;
PROCESS_INFORMATION pi; // set the size of the structures
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) ); // start the program up
CreateProcess( lpApplicationName, // the path
(char*)"", // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi // Pointer to PROCESS_INFORMATION structure (removed extra parentheses)
); cout << "process id: " << pi.dwProcessId << ", thread id: " << pi.dwThreadId << endl; // Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
} int main(int argv, char* args[])
{
cout << "caller_cpp:" << endl; // 1.
// 可以加路径,路径中应使用\\而非/
// WinExec("hello.exe", SW_SHOW); // 2.
// SHELLEXECUTEINFO shell = { sizeof(shell) };
// shell.fMask = SEE_MASK_FLAG_DDEWAIT;
// shell.lpVerb = "open";
// shell.lpFile = "hello.exe";
// shell.nShow = SW_SHOWNORMAL;
// BOOL ret = ShellExecuteEx(&shell); // 3.
// ShellExecuteA
// ShellExecute(NULL, "open", "hello.exe", NULL, NULL, SW_SHOWDEFAULT); // 4.
// system("hello.exe"); // 5.
Launch("hello.exe"); // 6.
// _execv("hello.exe", args); return 0;
}

收集了多种方式,建议使用CreateProcess(),详细内容查阅Microsoft Docs。

source/caller.f90

! name: caller.f90
! date: 2021/3/14
! PROGRAM Caller_fort PRINT *, "Caller_fort" ! Fortran 2008
call execute_command_line ("hello.exe", wait=.false.) !
call system("hello.exe") END

execute_command_lineFortran2008标准开始支持的函数。

参考资料

  1. cmake_ Selecting a generator within CMakeLists.txt - Stack Overflow
  2. Using cmake with fortran - Stack Overflow
  3. windows C_C++ 在一个程序中打开,关闭和监视其它的exe程序_lumanman_的博客-CSDN博客
  4. C++ 打开exe文件的方法(VS2008) - work hard work smart - 博客园
  5. C++ 中打开 exe 文件_楠木大哥的博客-CSDN博客
  6. C++程序中调用exe可执行文件_积累点滴,保持自我-CSDN博客_c++调用exe文件
  7. ShellExecuteA function (shellapi.h) - Win32 apps _ Microsoft Docs
  8. Creating Processes - Win32 apps _ Microsoft Docs
  9. _exec, _wexec Functions _ Microsoft Docs
  10. EXECUTE_COMMAND_LINE (The GNU Fortran Compiler)
  11. SYSTEM (The GNU Fortran Compiler)

Windows下C++/Fortran调用.exe可执行文件的更多相关文章

  1. windows下使用批处理调用exe和服务

    手动调用exe或者启动服务很麻烦,可以使用.bat批处理文件,双击运行即可.步骤如下:创建一个新的txt文件但是保存成.bat结尾的文件(选择用记事本打开编写命令),输入代码内容格式如下: @echo ...

  2. Windows下打包Python的exe可执行文件

    参考:http://www.cnblogs.com/Lands-ljk/p/5447723.html

  3. Linux的.a、.so和.o文件 windows下obj,lib,dll,exe的关系

    Linux的.a..so和.o文件 - chlele0105的专栏 - CSDN博客 https://blog.csdn.net/chlele0105/article/details/23691147 ...

  4. Linux的.a、.so和.o文件 windows下obj,lib,dll,exe的关系 动态库内存管理 动态链接库搜索顺序 符号解析和绑定 strlen函数的汇编实现分析

    Linux的.a..so和.o文件 - chlele0105的专栏 - CSDN博客 https://blog.csdn.net/chlele0105/article/details/23691147 ...

  5. C/C++ ShellExecuteEx调用exe可执行文件

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49591995 以商业的软件Enblen ...

  6. 关于windows下c++生成的exe发布时的依赖dll问题

    如同linux下通常要求安装特定版本的libstdc++一样,windows下vc++生成的exe发布时的依赖dll问题,可以参见帖子,http://bbs.csdn.net/topics/39105 ...

  7. Windows下C语言调用dll动态链接库

    dll是windows下的动态链接库文件,下面记录一下在windows下如何调用C语言开发的dll动态链接库. 1.dll动态链接库的源代码 hello_dll.c #include "st ...

  8. golang 在 windows 下编译出 linux 二进制可执行文件的软件套装合集 [go 1.7.3环境]

    golang 很好用,不过要把工具链弄完整. 要不你会发现怎么不能编译跨平台的呀? 怎么写代码没提示啊? ... 这一整套弄下来并不容易. 所以精心准备了一套工具方便大家使用. 软件列表如图. 安装顺 ...

  9. windows下使用c++调用redis

    不废话,unix下c++调用 redis可以看这个: http://blog.csdn.net/youngqj/article/details/8266177 ==================== ...

随机推荐

  1. BGV再度爆发,流通市值破500万美金!

    BGV似乎以超乎寻常的姿态,开启了爆发的模式.这两天,BGV一路上涨,日内最高涨至548.78美金,24小时成交额达到了98.07万美金,24小时成交量达到1844.93枚BGV,流通市值更是突破了5 ...

  2. 前端监控SDK开发分享

    目录 前言 收集哪些数据 性能 错误 辅助信息 小结 客户端SDK(探针)相关原理和API Web 微信小程序 编写测试用例 单元测试 流程测试 提供Web环境的方式 Mock Web API的方式 ...

  3. TERSUS无代码开发(笔记06)-简单实例手机端页面设计

    手机端的设计 1.页面说明 2.默认页面===>提交请假单(上面页面双击进入,页面主要编辑区) 2.1默认页面===>提交请假单===>头部区(页面部份主要编辑区01) 2.1.1默 ...

  4. Prism.WPF -- Prism框架使用(下)

    本文参考Prism官方示例 命令使用 Prism提供了两种命令:DelegateCommand和CompositeCommand. DelegateCommand DelegateCommand封装了 ...

  5. 【DB宝41】监控利器PMM的使用--监控MySQL、PG、MongoDB、ProxySQL等

    目录 一.PMM简介 二.安装使用 三.监控MySQL数据库 MySQL慢查询分析 四.监控PG数据库 五.监控MongoDB数据库 六.监控ProxySQL中间件 一.PMM简介 之前发布过一篇Pr ...

  6. 记录core中GRPC长连接导致负载均衡不均衡问题 二,解决长连接问题

    题外话: 1.这几天收到蔚来的面试邀请,但是自己没做准备,并且远程面试,还在上班时间,再加上老东家对我还不错.没想着换工作,导致在自己工位上做算法题不想被人看见,然后非常紧张.估计over了.不过没事 ...

  7. Java 常见对象 05

    常见对象·正则表达式 和 其他类 正则表达式的概述和简单使用 * A:正则表达式 * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则,有自己的特殊应用 * 作用: ...

  8. PTA甲级—常用技巧与算法

    散列 1078 Hashing (25 分) Quadratic probing (with positive increments only) is used to solve the collis ...

  9. EF Core中通过Fluent API完成对表的配置

    EF Core中通过Fluent API完成对表的配置 设置实体在数据库中的表名 通过ToTable可以为数据模型在数据库中自定义表名,如果不配置,则表名为模型名的复数形式 public class ...

  10. Linux-mysql服务级别对DB的操作要领[导出-导入(执行SQL)]及修改数据库名称

    A:docker容器的mysql docker exec -it mysql bash -- 进入容器 备份脚本 mysqldump -uroot -p123456 --databases dbNam ...