我正在开发一个 C++ 控制台应用程序,该应用程序允许与符合 GenICam 的工业相机进行通信。我安装了最新的 GenICam 包并将其集成到我的项目中。首先,我收到错误消息 C1083:无法打开“GenTL.h”,因此我将此标头移动到包含文件夹并意识到没有相应的二进制文件。现在我收到以下错误消息:
LNK2001 未解析的外部符号“__imp_GCInitLib”。
我不知道如何解决它。我想我需要进一步集成 *.lib,但我在包中找不到任何内容。我错过了什么吗?
谢谢你的帮助!
我正在开发一个 C++ 控制台应用程序,该应用程序允许与符合 GenICam 的工业相机进行通信。我安装了最新的 GenICam 包并将其集成到我的项目中。首先,我收到错误消息 C1083:无法打开“GenTL.h”,因此我将此标头移动到包含文件夹并意识到没有相应的二进制文件。现在我收到以下错误消息:
LNK2001 未解析的外部符号“__imp_GCInitLib”。
我不知道如何解决它。我想我需要进一步集成 *.lib,但我在包中找不到任何内容。我错过了什么吗?
谢谢你的帮助!
GenICam,或者更确切地说,GenAPI 仅处理实现 GenICam 的相机功能的枚举、统一(在不同供应商之间)、演示。
另一方面,GenTL 抽象了传输接口并向用户提供了一组标准化的功能。
因此,如果您想使用相机功能 (GenAPI),您首先需要使用传输层实现来扫描相机并与它们通信。
成为标准的一部分意味着传输层(GenTL)至少公开了列出的功能,GenTL.h
但通常更多。此外,GenTL 提供程序 - 正如您正确指出的那样 - 通常是由制造商提供的共享库,通常以.cti
.
这些可以动态加载,然后使用这些功能。以下是使用 Basler GenTL 提供程序的示例:
#include <GenTL.h>
#include <dlfcn.h>
#include <dirent.h>
int main(){
// Load DLL at runtime
void *lib = dlopen("/opt/pylon/lib/pylonCXP/bin/ProducerCXP.cti", RTLD_NOW | RTLD_DEEPBIND);
// Declare variables with variable definitions from GenTL.h
GenTL::PGCInitLib GCInitLib;
GenTL::PGCCloseLib GCCloseLib;
// Dynamically bind GenTL functions to local function calls
*reinterpret_cast<void**>(&GCInitLib) = dlsym(lib, "GCInitLib");
*reinterpret_cast<void**>(&GCCloseLib) = dlsym(lib, "GCCloseLib");
GCInitLib(); // Init GenTL provider
// [Discover cameras, open port, load GenICam, do things]
GCCloseLib();
}
然后可以用
g++ -l ldl main.cpp -o TestGenTL