c++ - 在 Visual Studio 2019 中将自定义脚本文件与 C++ 项目一起使用
问题描述
TL;博士
- 我的项目在运行时使用自定义脚本文件。
- 我的项目在 VS 中构建良好并在命令行上运行。
- 但是,在 VS 中运行时会引发错误,表明该文件不存在。
详细信息
我的 c++ 项目使用自定义脚本文件在运行时应用一些设置:
- 这些是类似于 javascript 但不是实际的 javascript
- 将这些设置不在已编译的文件中意味着可以在不重新编译的情况下更改它们 一切都很好,脚本是在构建后事件中使用 xcopy 复制的。
在 VS2019 中运行时,它似乎无法找到脚本文件。发出不透明的库特定错误: A GenApi error has occurred
但是当从 cmd运行生成的 .exe一切正常时,使用脚本没有问题。如果从输出目录中删除脚本文件并再次运行 .exe,我会得到相同的A GenApi error has occurred
.
我努力了:
- 在发布和调试中运行。
- 在构建中包括和排除文件。
我不想调试脚本,我只需要在启动期间使用它,这样我就可以调试 C++ 中的程序的其余部分.....
示例代码
主文件
#include <iostream>
#include <EGrabber.h>
void configure() {
Euresys::EGenTL gentl;
Euresys::EGrabber<> grabber(gentl);
grabber.runScript("config.js");
}
int main() {
try {
configure();
} catch (const std::exception &e) {
std::cout << "error: " << e.what() << std::endl;
}
}
配置.js
var grabber = grabbers[0];
var FPS = 150;
// camera configuration
grabber.RemotePort.set("TriggerMode", "On");
grabber.RemotePort.set("TriggerSource", "CXPin");
grabber.RemotePort.set("ExposureMode", "TriggerWidth");
// frame grabber configuration
grabber.DevicePort.set("CameraControlMethod", "RG");
grabber.DevicePort.set("CycleTriggerSource", "Immediate");
grabber.DevicePort.set("CycleMinimumPeriod", 1e6 / FPS);
更多信息:
脚本文档
解决方案
基于@john 的评论:
从VS运行和从命令行运行时,当前工作目录不同。
从VS运行时,当前工作目录是项目目录而不是输出目录。
该脚本project-dir\src
不在直接的项目目录中。
将脚本移到项目目录解决了一切。
可行的替代解决方案:
- 使用完整路径:
C:\\full\\path\\config.js
(应用程序启动路径可以从argv[0]中提取)
- 更改 VS 中的调试工作目录:
- 项目 -> 属性 -> 配置属性 -> 调试 -> 工作目录
- 输入输出路径,例如:$(SolutionDir)bin$(Platform)$(Configuration)\
推荐阅读
- ios - 如何从 Xib 加载的 ViewController 中设置 NavigationController 的 navigationItem 标题
- java - 在 Eclipse 中将 SQL Server 与 java 链接时 Ping 失败
- php - 如何在php数组/对象中转换和存储sql结果
- c++ - 实现特征库伪逆函数的 MEX 文件崩溃
- sql - 从多行中选择最新的属性
- perl - Perl Module::Load 未按预期工作
- delphi - 如何计算具有多个空格字符的文本文件中的所有单词
- r - mgcv:错误模型的系数比数据多,与 gam() 中的参数有关
- matlab - 对矩阵执行平滑函数,但现在只有匹配的索引给出值
- mysql - 三个表之间的 MySQL 查询(还有 ORDER 和 LIMIT)