找回密码
 注册
LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 1611|回复: 0

【讨论】关于CIN接口的一个小问题 +9.1 [精华] [转]

[复制链接]
发表于 2004-12-3 02:49:01 | 显示全部楼层 |阅读模式
<>问:最近按照基于LABVIEW的虚拟仪器设计一书上的CIN与C语言接口的例子做了一下,在C++最后编译时(COMPLIE FILES)提示缺少add.pch文件,无法生成lsb文件,怎么办?谢谢。</P>
<>答:在Visual C++下的编译过程:
a、 先创建一个Win32动态链接库文件,在Project菜单中打开“Add Project&gt;&gt;Files...”项,从LabVIEW子目录Cintools/Win32中选择cin.obj,labview.lib,lvsb.lib和lvsbmain.def这四个文件,它们是编译CIN节点C语言程序时必须的。
b、 在Project&gt;&gt;Settings菜单中,将“Settings for:”选项设置为“All Configurations”,“C/C++&gt;&gt;Category:”项设为“Preprocessor”。然后把cintools所在目录加入到“Additional include directories:”项中。
c、 将“C/C++&gt;&gt;Category:”项设为“Code Generation”,并将其“Struct Member Alignment:”、“User Run-Time Library:”两个子项分别设置为“1 Byte”和“Multithreaded DLL”。
d、 选择“Custom Build”项,将“Build Commands Field:”设为“Cintools所在目录\lvsbutil $(TargetName) –d $(WkspDir)\$(OutDir)”,将“Output File Field:”设为$(OutDir)$(TargetName).lab。
设置好上述参数后,就可以在VC中对CIN节点C语言程序进行编译了,将会产生一个后缀为.lsb的目标代码文件。

注意空格,将上面的东西直接拷贝 </P>
<>
答:引用:设置好上述参数后,就可以在VC中对CIN节点C语言程序进行编译了,将会产生一个后缀为.lsb的目标代码文件。
   参数都像上面一样设置好了,可是提示:设置好上述参数后,产生一个错误:fatal error C1010: unexpected end of file while looking for precompiled header directive
Error executing cl.exe.真让我郁闷~~~~~~~~~~~~~我用的c++6.0。新建dll时有3个可以选,我选的是simple。cintools下没有win32文件夹。我直接copy那4个文件过去的。
</P>
<P>答:不好意思啊,刚才才看了置顶的帖子,搜索了半天,好像这是个通病啊,一个空格都不能错。现在打算试试自己做DLL看行不行。多谢楼上的楼上的那位老兄。欢迎大家继续,有做好的lsb文件更好,嘿嘿~~~~~~~·
</P>
<P>答:按照你的方法产生的错误是
Linking...
Performing Custom Build Step on .\Debug\mult.dll
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
Error executing c:\windows\system32\cmd.exe.

mult.dll - 1 error, 0 warning</P>
<P>
答:直接写个DLL,何必用CIN呢
答:能说说怎么写吗?
</P>
<P>答:1。// 新建一个空的Win32 Dll 工程
加入新的cpp,写入下面代码
  _declspec(dllexport) int sum(int a, int b)
{
  return a+b;
}
Build出一个dll:sum.dll
2。// 新建一个新的Win32 Console程序
选择Simple Console Application,修改main函数所在的cpp:
#include "stdafx.h"

// for IO
#include &lt;iostream&gt;
using namespace std;

// for base type and LoadLibrary
#include &lt;WINDOWS.H&gt;

// define function pointer which will point to sum(a, b)
typedef int(*Func)(int,int);
int main(int argc, char* argv[])
{
  HMODULE dll = :oadLibrary("sum.dll");// 加载刚才那个dll,路经要对
  if(dll)
  {
    Func f = (Func)GetProcAddress(dll, "?sum@@YAHHH@Z");// 加载那个sum函数
    if
      cout&lt;&lt;f(3, 4); // 等价于调用 sum(3, 4)
    else
      cout&lt;&lt;"function call error";
  }
  else
    cout&lt;&lt;"lodad error";
}

Build &amp; Execute
3。上面一个不便的地方就是GetProcAddress,第二个参数是个很复杂的字符串,需要事先用dumpbin sum.dll /exports得到sum函数的实际名称
   所以,一般会在最上面写dll时,导出函数前面不仅加上已有的红字表示导出,还要加上extern "C" ,表示以C方式编译,因为C方式编译时,函数名在库中和在程序代码中会保持一致,不像C++生成新的编码后的函数名。
那么,上述的dll函数声明就是
extern "C" _declspec(dllexport) int sum(int a, int b)
而调用程序的GetProcAddress行就改为:
Func f = (Func)GetProcAddress(dll, "sum");
4.编译为dll
5。在lv中用call library调用
</P>
<P>答:那是因为你的cintools的文件名过长,或者编译器不认的长文件名。
你可以把lvsbutil.exe复制到你的工程文件夹下。这样你就不用再在costom build的command中输入那个长长的cintools目录了。
try it again.
我现在遇到的问题是lsb在vc++.net下的编译错误问题,希望你也试试,我们讨论一下
</P>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2026-9-28 07:28 , Processed in 0.024566 second(s), 8 queries , Gzip On, File On.

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表