使用签证编译dll / exe - 链接失败[重复]

Posted

技术标签:

【中文标题】使用签证编译dll / exe - 链接失败[重复]【英文标题】:Compile dll / exe using visa - linking fails [duplicate] 【发布时间】:2016-06-09 10:44:47 【问题描述】:

我更像是一个 c++ 菜鸟。我想使用签证创建一个dll。我将问题简化为一个 exe 示例。我有以下 MnWE:

#include <cstdlib>
#include <sstream>
#include <string>
#include <iostream>
#include <stdio.h>
#include <stdexcept>
#include <windows.h>
#include "visa.h"

using namespace std;

ViSession defaultRM = 0;

//opens VI-Session in specific address. Puts the defaultRM stuff "away".
void openVI (char* adress, ViSession vi, string mode, int timeout)
        if(defaultRM == 0) 
            viOpenDefaultRM(&defaultRM);// Initialize VISA system
            if(defaultRM==0)
                cerr << "initalizing defaultRM failed";
            else
                cout << "defaultRM initalized";
            
        else
        
        ViAccessMode viMode = VI_NULL;
        ViUInt32 viTimeout = VI_NULL;
        if(mode == "EXCLUSIVE")
            viMode = VI_EXCLUSIVE_LOCK;
            viTimeout = timeout;
        else if(mode == "DEFAULT")//Code für default kann hier eingefügt werden. Derzeit nichts vorgesehen.
        else
        
        viOpen(defaultRM, adress, viMode, viTimeout, &vi);
    


int main()
    ViSession vi;
    openVI("ASRL2::INSTR", vi, "DEFAULT", 0);
    if(vi = 0)
        cout << "failed" << endl;
    else
        cout << "success" << endl;
    


    return 0;

使用 gcc 和命令编译时

g++ -static -o VITest.exe VITest.cpp

我收到以下错误:

F:\Users\gabriel\AppData\Local\Temp\ccEx2dRK.o:VITest.cpp:(.text+0x17): undefined reference to `viOpenDefaultRM@4'
F:\Users\gabriel\AppData\Local\Temp\ccEx2dRK.o:VITest.cpp:(.text+0xbd): undefined reference to `viOpen@20'
collect2.exe: error: ld returned 1 exit status

就我的 gooleing 而言,它似乎与库的链接有关。我的电脑上还没有安捷伦签证发行版。我只是将 visa.h、visadef.h 和 visa.lib 放入与 cpp 文件相同的文件夹中。我想,它可能与那个有关。但我只想在绝对必要的时候安装它。最终程序将在另一台机器上运行。

【问题讨论】:

我建议您测试与visa32.dll 的链接,例如g++ -Wall -O -L. -lvisa32 -Wl,--enable-stdcall-fixup -o test.exe test.cpp。我使用交叉编译器在 linux 上成功测试了这个,visa32.dll 的副本与test.cpp(您的代码)位于同一目录中。 【参考方案1】:

您没有将库包含在您的编译中。将您的 g++ 行更改为:

g++ -static -o VITest.exe VITest.cpp -L. -lvisa

【讨论】:

我试过了。但据我所知,我需要 libvisa.a。但我确实有 visa.lib。我刚试了一下,g++ 说:e:/mingw/bin/../lib/gcc/mingw32/4.9.3/../../../../mingw32/bin/ld.exe: cannot fin d -lvisa collect2.exe: error: ld returned 1 exit status 我猜你正在使用 MingGW,对吗?较新的版本支持.lib 文件,所以它应该可以工作。尝试将 -l 更改为 -l:visa.lib 以明确指定它 好的,很高兴知道。 MinGW 是相当新的,所以它应该可以工作。明显的问题是,它在 MinGW 文件夹中而不是在当前文件夹中查找文件。 只需添加-L. 即可按照上述编辑对该问题进行排序 到目前为止非常感谢:但它仍然不起作用。我假设它指的是缺少的 dll 或 lib。我仍然收到此错误消息:F:\Users\name\AppData\Local\Temp\ccdzAEIg.o:VITest.cpp:(.text+0x17): undefine d reference to viOpenDefaultRM@4' F:\Users\name\AppData\Local\Temp\ccdzAEIg.o:VITest.cpp:(.text+0xbd): undefine d reference to viOpen@20' collect2.exe: error: ld returned 1 exit status

以上是关于使用签证编译dll / exe - 链接失败[重复]的主要内容,如果未能解决你的问题,请参考以下文章

用户 DLL/EXE 中的堆分配失败

将LIB中的代码加入目标模块(EXE或者DLL)文件中

C语言怎么使用动态链接库,如何创建?(高手进)

C程序,编译和链接后,会产生一个包含edata部分的EXE文件?

windows下cmake生成动态链接库dll

C++。将.dll文件链接到项目[重复]