用Vs2013+VELT进行Linux开发:动态库

快乐虾

http://blog.csdn.net/lights_joy/

欢迎转载,但请保留作者信息

本文适用于vs2013 + Visual EmbedLinux Tools 0.1.1

1.1    什么是VELT


VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发。利用这个插件,将可以在visual studioIDE中进行Linux应用程序的开发(包括编译和调试),也可以进行ubootlinux内核的编译,并根据编译时的错误信息正确定位到源码。目前的版本是0.1.1,仅支持vs2013,是一个刚刚启动开发不久的插件。可以在CSDN下载频道下载(http://download.csdn.net/detail/lights_joy/8322193)。下面是它的基本功能:

  1. 支持x86 Linuxhi3516hi3520三个平台。

  2. 完成UBOOT的编译,并根据编译的错误信息自动定位到相应的文件位置。

  3. 完成LINUX内核的编译,并根据编译的错误信息自动定位到相应的文件位置。

  4. 完成LINUX内核的配置。

  5. 不使用Makefile进行Linux应用程序的编译。

  6. 使用SSH连接目标机器并用gdb进行应用程序的调试。

  7. 使用Telnet连接目标机器并用gdb进行应用程序的调试。


VELT提供的示例工程中并不包含动态库,本文尝试添加一个动态库的工程。

首先将LinuxConsoleApplication复制一份,改名为LinuxShareLib

1.2    修改常规属性

接着修改常规属性,将配置类型修改为动态库,将文件扩展名改为.so,将要删除的文件扩展名改为*.o;*.so,将目标文件名加上lib做为前缀。

技术分享


1.3    定义输出函数

main.c中定义一个要输出的函数:


int sum_test(int a, int b)
{
	printf("a = %d, b = %d, result = %d", a, b, a + b);
	return a + b;
}

生成此工程:

1>------已启动生成: 项目: LinuxShareLib, 配置:Debug Linux ------

1>  -------ClCompile Task-----------

1>  create new compiler engine

1>  Last login: Fri Jan  2 19:01:04 2015 from 192.168.24.128

1> 

1>  PATH=/usr/binbin/:$PATH

1>  cd/work/projects/test/LinuxConsoleApplication/LinuxShareLib/

1>  gcc -c      -O0   -g3    -o ../obj/Linux/Debug/LinuxShareLib/main.omain.c

1>  --------- link here -------------------

1>  cd/work/projects/test/LinuxConsoleApplication/LinuxShareLib/

1>  gcc -shared   -o ../bin/Linux/Debug/LinuxShareLib.so../obj/Linux/Debug/LinuxShareLib/main.o

==========生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 ==========

很顺利地生成了libLinuxShareLib.so

1.4    引用动态库

接下来我们在LinuxConsoleApplication工程中引用此动态库:

int sum_test(int a, int b);

int main(int argc, char* argv[])
{
	int a = 3;
	int b = 4;
	printf("Hello: a + b = %d\n", sum_test(a, b));
	getchar();
	return 0;
}

生成解决方案,理所当然地链接错误:

1>------已启动生成: 项目: ConsoleApplication, 配置: Debug Linux ------

1>  -------ClCompile Task-----------

1>  cd/work/projects/test/LinuxConsoleApplication/LinuxConsoleApplication/

1>  gcc -c      -O0   -g3    -o../obj/Linux/Debug/ConsoleApplication/main.o main.c

1>  --------- link here -------------------

1>  cd/work/projects/test/LinuxConsoleApplication/LinuxConsoleApplication/

1>  gcc  -o ../bin/Linux/Debug/ConsoleApplication../obj/Linux/Debug/ConsoleApplication/main.o

1>  ../obj/Linux/Debug/ConsoleApplication/main.o:In function `main‘:

1> \work\projects\test\LinuxConsoleApplication\LinuxConsoleApplication\main.c13:error C2004:  undefined reference to`sum_test‘

1>  collect2: ld returned 1 exit status

==========生成: 成功 0 个,失败 1 个,最新 1 个,跳过 0 ==========


1.5    添加链接库

LinuxConsoleApplication的链接器选项中添加库目录:

技术分享

由于Linux下的动态库并不需要同名的.lib之类的静态库,因此这里的路径直接指向.so所在的路径,这里的路径可以使用相对于工程文件所在目录的相对路径,也可以使用绝对路径,但必须保证这个路径可以在Linux下访问。还需要注意大小写!

这里的每一个路径都对应于一个gcc-L参数。

接着在LinuxConsoleApplication的链接器选项中添加LinuxShareLib的引用:

技术分享


这里的附加依赖项可以填上.so文件的名字,但不需要加扩展名,每一个名字之间用空格分隔,它们的名字加上-l就是传递给gcc的参数。

再生成解决方案就OK了:

1>------已启动生成: 项目: LinuxShareLib, 配置:Debug Linux ------

1>  -------ClCompile Task-----------

1>  cd/work/projects/test/LinuxConsoleApplication/LinuxShareLib/

1>  --------- link here -------------------

1>  cd/work/projects/test/LinuxConsoleApplication/LinuxShareLib/

1>  gcc -shared   -o ../bin/Linux/Debug/libLinuxShareLib.so../obj/Linux/Debug/LinuxShareLib/main.o

2>------已启动生成: 项目: ConsoleApplication, 配置: Debug Linux ------

2>  -------ClCompile Task-----------

2>  cd/work/projects/test/LinuxConsoleApplication/LinuxConsoleApplication/

2>  --------- link here -------------------

2>  cd/work/projects/test/LinuxConsoleApplication/LinuxConsoleApplication/

2>  gcc -lLinuxShareLib  -L../bin/Linux/Debug/    -o ../bin/Linux/Debug/ConsoleApplication../obj/Linux/Debug/ConsoleApplication/main.o

==========生成: 成功 2 个,失败 0 个,最新 0 个,跳过 0 ==========


1.6    调试

由于在此项目中使用了动态库,在调试时需要导出动态库的路径,否则gdb将无法正常加载工程,因此需要修改LinuxConsoleApplication工程中的make.py文件。

在这里定义了一个Python函数:

    def LoadDebugFile(self, chan) :
        exec_command(chan, 
                     "cd /mnt/hgfs/embed/bin/Linux/Debug/ &&"
                     "export LD_LIBRARY_PATH=. &&"
                     "echo xxxx\n")
        return True

在调试器使用gdb加载要调试的程序之前会调用此函数,在这里可以执行一个shell脚本,在这里我们只对上述脚本做个简单的修改,让它导出库的路径:

    def LoadDebugFile(self, chan) :
        exec_command(chan, 
                     "cd /work/projects/test/LinuxConsoleApplication/bin/Linux/Debug/ &&"
                     "export LD_LIBRARY_PATH=. &&"
                     "echo xxxx\n")
        return True

而后就可以正常调试了。

技术分享

目前在调试时存在一个BUG,如果在程序运行时关闭那个Console窗口,虽然VS可以正常结束调试,但再次启动调试时将出错。

如果是使用VS中的停止调试功能则没有此问题。

此项目可以在csdn下载:http://download.csdn.net/detail/lights_joy/8323451






??

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。