vs 错误:

vs 错误:

因为工作须求,对ZeroMQ举行简短的钻研选择,为了使我们更好、更快的求学生运动用ZeroMQ,本文将从下载、安装、编写翻译、几上边来对ZeroMQ做个鲜明的学科总括。

lib 和 dll
的区分、生成以及使用详解

    error LNK1104: 十分的小概开拓文件“libzmq.lib”

    error LNK1104: 不能够打开文件“libzmq.lib”

(1)到官网下载最新的ZeroMQ安装包:
(2)解压:tar -xvf zeromq-4.1.4.tar.gz 
(3)切换来解压文件夹:cd zeromq-4.1.4
(4)./configure –prefix=/opt/toolschain/zeroMQ/zeromq_gcc/ 
想把GCC版本的zeroMQ安装到/opt/toolschain/zeroMQ/zeromq_gcc,可是那时出现了不当的景色,而且没有产生Makefile文件。

【目录】

缓解格局:  

涸泽而渔办法:  

澳门金沙国际 1
 
不留余地方案:ibsodium
是贰个风行、易于使用的软件库。首要用于加密、解密、签名和转变密码哈希等等。那是1个可移植的、跨编写翻译器援救、可安装的,基于
NaCl 开发,提供3个合营API。它的对象是为全体创设更高级别的加密工具提供所供给的骨干操作。
从而,在合法难题解答在那之中找到了化解方案,那正是不行使这一个库,只须求添加“–without-libsodium”即可
()
即,执行:[root@localhost zeromq_gcc]# ./configure
–prefix=/opt/toolschain/zeroMQ/zeromq_gcc/ –without-libsodium

lib
dll介绍

    你协调新建项目后,要求操作
项目》属性》链接器》常规》附加库目录》,然后把 libzmq.lib
库文件所在的目录添加进去。

    你协调新建项目后,要求操作
项目》属性》链接器》常规》附加库目录》,然后把 libzmq.lib
库文件所在的目录添加进去。

(5)编译:[root@localhost zeromq_gcc]# ./configure
–prefix=/opt/toolschain/zeroMQ/zeromq_gcc/ –without-libsodium

扭转动态库

 

 

==================================================
注意:假使是想用arm-linux-gcc版本的,那么就的添加–host参数。
编译:[root@localhost zeromq-4.1.4]#
./configure –host=arm-none-linux-gnueabi
–prefix=/opt/toolschain/zeroMQ/zeromq_arm/
–without-libsodium

调用动态库

接下来,以下别的操作都是同一,不过最终一步,需求将编写翻译成功的lib下的库文件libzmq.so.5复制到A凯雷德M开发板的lib库文件夹其中

澳门金沙国际 2
 
推行成功后,生成Makefile编写翻译文件。
(6)make

澳门金沙国际 3
 
(7)make install

澳门金沙国际 4
 
(8)查看安装目录下转移的gcc版本库文件

澳门金沙国际 5
 
(9)测试程序(gcc版本,若是是arm版本须求修改为CC=arm-linux-gcc,同时.c文件包括的库目录也不一致)

Makefile代码:

#Makefile for zeroMQ program
#Create Date:  2017-06-30
#Date Modified:  2017-06-30
#Author:      xinnanbufei

CC =gcc
CFLAGS = -std=gnu99 -Wall
PROGS = zmq_client.o
TARG = zmq_client

LINK_ZMQ = -I
/opt/toolschain/zeroMQ/zeromq_gcc/include -L
/opt/toolschain/zeroMQ/zeromq_gcc/lib -lzmq

ZeroMQ编译安装使用教程,生成以及使用详解。all: $(PROGS)
 $(CC) $(CFLAGS) -o $(TARG) $^  $(LINK_ZMQ)

clean:
 rm -rf *.o *~ zmq_client

zeroMQ server代码:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include “/opt/toolschain/zeroMQ/zeromq_gcc/include/zmq.h”
int main (void)
{
 /*  Socket to talk to clients    */
 void *context = zmq_ctx_new ();
 void *responder = zmq_socket (context, ZMQ_REP);
 int rc = zmq_bind (responder, “tcp://*:5555”);
 assert (rc == 0);
 while(1)
 {
  char buffer [10];
  zmq_recv (responder, buffer, 10, 0);
  printf (“Received Hello\n”);
  sleep (1);          /*Do some ‘work’*/
  zmq_send (responder, “World”, 5, 0);
 }
 return 0;
}

zeroMQ client代码:

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include “/opt/toolschain/zeroMQ/zeromq_gcc/include/zmq.h”
int main (void)
{
 printf (“Connecting to hello world server…\n”);
 /*创设3个新的上下文*/
 void *context = zmq_ctx_new ();
 void *requester = zmq_socket (context, ZMQ_REQ);
 /*透过tcp协议,5555端口,连接本机服务端*/
 zmq_connect (requester, “tcp://localhost:5555”);
 int request_nbr;
 for (request_nbr = 0; request_nbr != 10; request_nbr++)
 {
  char buffer [10];
  printf (“Sending Hello %d…\n”, request_nbr);
  zmq_send (requester, “Hello”, 5, 0);
  zmq_recv (requester, buffer, 10, 0);
  printf (“Received World %d\n”, request_nbr);
 }
 zmq_close (requester);
 zmq_ctx_destroy (context);
 return 0;
}

(10)Make编译,成功

(11)执行./zmq_server  或者  zmq_server  出现难点

./zmq_client: error while loading shared libraries: libzmq.so.5: cannot
open shared object file: No such file or directory

澳门金沙国际 6
 
(12)消除难题

是因为没有将zeromq的lib路径添加到 ld.so.conf那里 。

那未来大家将libzeromq.so的不二法门添加涛ld.so.conf中,具体操作步骤如下:

A、进入到 etc 下  cd /etc

澳门金沙国际 7
澳门金沙国际, 
B、编辑 ld.so.conf ,sudo vim ld.so.conf
加入 libzmq.so 的路径  /usr/local/zeromq/lib
保留之后

澳门金沙国际 8
 
C、保存退出后,再实践命令ldconfig

澳门金沙国际 9
 
不必然展现zeroMQ的lib路径,通过即可。
(13)以上步骤实现后,重新编写翻译程序,执行成功

澳门金沙国际 10澳门金沙国际 11
 
(14)gcc版本移植成功!!!
(15)arm-linux-gcc版本,须要移植最终一步
将libzmq.so.5复制到A奥迪Q7M文件系统的lib文件夹下

澳门金沙国际 12
 
(16)arm-linux-gcc版本移植成功!!!

正文永久更新链接地址:http://www.linuxidc.com/Linux/2017-06/145320.htm

澳门金沙国际 13

变迁静态库

调用静态库


首先介绍一下静态库(静态链接库)、动态库(动态链接库)的定义,首先两者都以代码共享的主意。

静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,那种库称为静态库,其特色是可执行文件中带有了库代码的一份完整拷贝;缺点就是被一再选取就会有多份冗余拷贝。即静态库中的指令都全体被直接蕴含在结尾生成的
EXE 文件

中了。在vs中新建生成静态库的工程,编写翻译生成成功后,只发生1个.lib文书

动态库:动态链接库是贰个富含可由几个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种艺术,使进度能够调用不属于其可实施代码的函数。函数的可实施代码位于一个DLL 中,该 DLL
包蕴3个或多个已被编写翻译、链接并与运用它们的历程分开储存的函数。在vs中新建生成动态库的工程,编写翻译成功后,爆发2个.lib文本和三个.dll文件

那正是说上述静态库和动态库中的lib有怎么样分别呢?

静态库中的lib:该LIB包罗函数代码本身(即包含函数的目录,也包括达成),在编写翻译时直接将代码加入程序个中

动态库中的lib:该LIB包涵了函数所在的DLL文件和文件中等学校函授数地点的音信(索引),函数实现代码由运维时加载在进程空间中的DLL提供

一句话来说,lib是编译时用到的,dll是运营时用到的。即使要做到源代码的编写翻译,只要求lib;要是要使动态链接的程序运营起来,只需求dll

以下例子均在vs2009上测试


变迁和行使动态库

转移动态库

新建项目–win32种类–填写项目名–鲜明–下一步–应用程序类型:选用dll–附加选项:选拔导出符号–完结

能够看看变化了三个dllmain.cpp
文件,这是dll应用程序的输入,注意它和普通工程的入口main函数不一致,这么些文件我们不须要修改。

在这么些动态库中大家举例导出二个变量,三个类,3个函数,头文件dll.h如下:

澳门金沙国际 14)

 1 //新建生成dll的工程时,vs默认定义了宏DLL_EXPORT,因此,DLL_API 是 __declspec(dllexport),用来导出
 2 //当我们在静态调用dll时,我们包含该头文件,由于没有定义DLL_EXPORT,所以DLL_API是
 3 //__declspec(dllimport),用来导入
 4 #ifdef DLL_EXPORTS
 5 #define DLL_API __declspec(dllexport)
 6 #else
 7 #define DLL_API __declspec(dllimport)
 8 #endif
 9 
10 // 导出类
11 class DLL_API Cdll {
12 public:
13     Cdll(void);
14     // TODO: 在此添加您的方法。
15 };
16 
17 //导出变量,变量在.cpp文件中定义
18 extern DLL_API int ndll;
19 
20 //导出函数,加extern "C",是为了保证编译时生成的函数名不变,这样动态调用dll时才能
21 //正确获取函数的地址
22 extern "C" DLL_API int fndll(void);

澳门金沙国际 15)

dll.cpp 文件如下:

澳门金沙国际 16)

 1 #include "dll.h"
 2 
 3 
 4 // 这是导出变量的一个示例
 5 DLL_API int ndll=6;
 6 
 7 // 这是导出函数的一个示例。
 8 DLL_API int fndll(void)
 9 {
10     return 42;
11 }
12 
13 // 这是已导出类的构造函数。
14 // 有关类定义的信息,请参阅 dll.h
15 Cdll::Cdll()
16 {
17     return;
18 }

澳门金沙国际 17)

调用动态库

有三种方式调用动态库,一种隐式链接,一种展现链接。

调用动态库:隐式链接

隐式链接 需求.h文件,dll文件,lib文件

(1)将dll放到工程的劳作目录

(2)设置项目性质–vc++目录–库目录为lib所在的路线

(3)将lib添加到项目性质–链接器–输入–附加依赖项(可能直接在源代码中插足#pragma
comment(lib, “**.lib”))

(4)在源文件中添加.h头文件

下一场就好像平日一样调用一般函数、类、变量

调用动态库:展现链接

展现链接
只须求.dll文件,但是那种调用方式不能够调用dll中的变量只怕类(其实能够调用类,可是一定辛勤,有兴趣者可参看)

展示调用重要采用WIN32 API函数LoadLibrary、GetProcAddress,举例如下:

澳门金沙国际 18)

 1 typedef int (*dllfun)(void);//定义指向dll中函数的函数指针
 2     HINSTANCE hlib = LoadLibrary(".\\dll.dll");
 3     if(!hlib)
 4     {
 5         std::cout<<"load dll error\n";
 6         return -1;
 7     }
 8     dllfun fun = (dllfun)GetProcAddress(hlib,"fndll");
 9     if(!fun)
10     {
11         std::cout<<"load fun error\n";
12         return -1;
13     }
14     fun();

澳门金沙国际 19)


浮动和接纳静态库

变更静态库

新建项目–win32品种–填写项目名–鲜明–下一步–应用程序类型:选择静态库

静态库项目没有main函数,也绝非像dll项目中的dllmain。

创设项目后添加.h文件,添加相应的导出函数、变量或类,如下所示

澳门金沙国际 20)

 1 #ifndef _MYLIB_H_
 2 #define _MYLIB_H_
 3 
 4 void fun(int a);
 5 
 6 extern int k;
 7 
 8 class testclass
 9 {
10 public:
11     testclass();
12     void print();
13 };
14 
15 #endif

澳门金沙国际 21)

.cpp文件如下

澳门金沙国际 22)

 1 #include "stdafx.h"
 2 #include "lib.h"
 3 #include <iostream>
 4 
 5 void fun(int a)
 6 {
 7     std::cout<<a<<"lib gen\n";
 8 }
 9 
10 int k = 222;
11 
12 testclass::testclass()
13 {
14     std::cout<<"123\n";
15 }
16 
17 void testclass::print()
18 {
19     std::cout<<"this is testcalss\n";
20 }

澳门金沙国际 23)

编写翻译工程后就会变卦3个.lib文本

选取静态库

需要.h文件,lib文件

(1)设置项目性质–vc++目录–库目录为lib所在的路子

(2)将lib添加到项目性质–链接器–输入–附加依赖项(大概直接在源代码中进入#pragma
comment(lib, “**.lib”))

(3)在源文件中添加.h头文件

下一场就如平时一样调用一般函数、类、变量,举例如下:

澳门金沙国际 24)

 1 #include <iostream>
 2 #include "lib.h"
 3 
 4 #pragma comment(lib, "lib.lib")
 5 
 6 int main()
 7 {
 8     fun(4);
 9     std::cout<<k<<std::endl;
10     testclass tc; 
11     tc.print();
12     return 0;
13 }

澳门金沙国际 25)

相关文章