首页 > 代码库 > 用VS2013+VELT-0.1.3进行Linux开发:动态库

用VS2013+VELT-0.1.3进行Linux开发:动态库

快乐虾

http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651)

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

本文仅适用于vs2013 + velt-0.1.3


1.1    什么是VELT


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

  1. 支持x86 Linuxhi3516hi3520MinGW这几个平台。

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

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

  4. 完成Linux内核的配置。

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

  6. 使用Makefile进行Linux应用程序的开发。

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

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



在生成了第一个ConsoleApplication之后,再试试动态库的功能,直接在之前的ConsoleApplication中添加一个新的项目:

技术分享


同样配置好IntelliSense参数和编译主机参数。


1.2    文件重命名


当前版本的VELT存在一个BUG,当解决方案中存在同名文件时,gdb将无法正确绑定断点,因此将默认的main.c改为dll_main.c


 


1.3    修改项目类型


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



1.4    定义输出函数


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

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

生成此工程:

1>------ 已启动生成:  项目: DynLibrary, 配置: Debug Linux ------
1>  -------ClCompile Task-----------
1>  VisualEmbedLinux>cd /mnt/hgfs/projects/tmp/ConsoleApplication1/DynLibrary/
1>  VisualEmbedLinux>gcc -c         -O0   -g    -o ../obj/Linux/Debug/DynLibrary/dll_main.o dll_main.c
1>  --------- Link Task -------------------
1>  VisualEmbedLinux>cd /mnt/hgfs/projects/tmp/ConsoleApplication1/DynLibrary/
1>  VisualEmbedLinux>gcc -o ../bin/Linux/Debug/libDynLibrary.so ../obj/Linux/Debug/DynLibrary/dll_main.o -shared  -L../bin/Linux/Debug/
1>  DynLibrary.vcxproj -> F:\projects\tmp\ConsoleApplication1\DynLibrary\..\bin\Linux\Debug\libDynLibrary.so
========== 生成:  成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

很顺利地生成了libDynLibrary.so


1.5    引用动态库


接下来我们在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>------ 已启动生成:  项目: ConsoleApplication1, 配置: Debug Linux ------
1>  -------ClCompile Task-----------
1>  VisualEmbedLinux>cd /mnt/hgfs/projects/tmp/ConsoleApplication1/ConsoleApplication1/
1>  VisualEmbedLinux>gcc -c         -O0   -g    -o ../obj/Linux/Debug/ConsoleApplication1/main.o main.c
1>  --------- Link Task -------------------
1>  VisualEmbedLinux>cd /mnt/hgfs/projects/tmp/ConsoleApplication1/ConsoleApplication1/
1>  VisualEmbedLinux>gcc -o ../bin/Linux/Debug/ConsoleApplication1 ../obj/Linux/Debug/ConsoleApplication1/main.o -L../bin/Linux/Debug/
1>  ../obj/Linux/Debug/ConsoleApplication1/main.o: In function `main‘:
1>  F:\projects\tmp\ConsoleApplication1\ConsoleApplication1\main.c(15): error C2007:  undefined reference to `sum_test‘
1>  collect2: ld returned 1 exit status
========== 生成:  成功 0 个,失败 1 个,最新 1 个,跳过 0 个 ==========

1.6    添加链接库


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

技术分享

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

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

接着在ConsoleApplication的链接器选项中添加DynLibrary的引用:

技术分享

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

再生成解决方案就OK了:

1>------ 已启动生成:  项目: ConsoleApplication1, 配置: Debug Linux ------
1>  -------ClCompile Task-----------
1>  VisualEmbedLinux>cd /mnt/hgfs/projects/tmp/ConsoleApplication1/ConsoleApplication1/
1>  VisualEmbedLinux>gcc -c         -O0   -g    -o ../obj/Linux/Debug/ConsoleApplication1/main.o main.c
1>  --------- Link Task -------------------
1>  VisualEmbedLinux>cd /mnt/hgfs/projects/tmp/ConsoleApplication1/ConsoleApplication1/
1>  VisualEmbedLinux>gcc -o ../bin/Linux/Debug/ConsoleApplication1 ../obj/Linux/Debug/ConsoleApplication1/main.o -lDynLibrary  -L../bin/Linux/Debug/
1>  ConsoleApplication1.vcxproj -> F:\projects\tmp\ConsoleApplication1\ConsoleApplication1\..\bin\Linux\Debug\ConsoleApplication1
========== 生成:  成功 1 个,失败 0 个,最新 1 个,跳过 0 个 ==========

1.7    调试


ConsoleApplication设置为启动项目,在main函数设置断点,F5启动调试,一切正常。


此处存在一个BUG,当我们在sum_test函数中设置断点时,VS无法中断,但在main函数中设置断点并单步跟踪则可以进入sum_test函数。













??

用VS2013+VELT-0.1.3进行Linux开发:动态库