用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 studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码。目前的版本是0.1.3,仅支持vs2013,是一个刚刚启动开发不久的插件。可以在CSDN下载频道下载(http://download.csdn.net/detail/lights_joy/8396189),安装过程参见《用VS2013+VELT-0.1.3进行Linux开发:环境搭建》。下面是它的基本功能:
支持x86 Linux,hi3516,hi3520,MinGW这几个平台。
完成UBOOT的编译,并根据编译的错误信息自动定位到相应的文件位置。
完成LINUX内核的编译,并根据编译的错误信息自动定位到相应的文件位置。
完成Linux内核的配置。
不使用Makefile进行Linux应用程序的编译。
使用Makefile进行Linux应用程序的开发。
使用SSH连接目标机器并用gdb进行应用程序的调试。
使用Telnet连接目标机器并用gdb进行应用程序的调试。
在生成了ConsoleApplication和动态库之后,再试试静态库的功能,直接在之前的ConsoleApplication中添加一个新的项目:
同样配置好IntelliSense参数和编译主机参数。
1.2 修改项目类型
接着修改配置类型,将配置类型修改为静态库,将文件扩展名改为.a,将要删除的文件扩展名改为*.o;*.a,将目标文件名加上lib做为前缀。
1.3 测试代码
在main.c中定义一个要输出的函数:
int static_test(int a, int b) { printf("a = %d, b = %d, result = %d", a, b, a + b); return a + b; }
生成此工程:
1>------ 已启动生成: 项目: StaticLibrary, 配置: Debug Linux ------ 1> -------ClCompile Task----------- 1> VisualEmbedLinux>cd /mnt/hgfs/projects/tmp/ConsoleApplication1/StaticLibrary/ 1> VisualEmbedLinux>gcc -c -O0 -g -o ../obj/Linux/Debug/StaticLibrary/main.o main.c 1> --------- lib here ------------------- 1> ..\obj\Linux\Debug\StaticLibrary\main.o 1> VisualEmbedLinux>cd /mnt/hgfs/projects/tmp/ConsoleApplication1/StaticLibrary/ 1> VisualEmbedLinux>ar -qv ../bin/Linux/Debug/libStaticLibrary.a ../obj/Linux/Debug/StaticLibrary/main.o 1> ar: creating ../bin/Linux/Debug/libStaticLibrary.a 1> a - ../obj/Linux/Debug/StaticLibrary/main.o 1> StaticLibrary.vcxproj -> F:\projects\tmp\ConsoleApplication1\StaticLibrary\..\bin\Linux\Debug\libStaticLibrary.a ========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
很顺利地生成了libStaticLibrary.a。
1.4 引用库
接下来我们在ConsoleApplication工程中引用此静态库:
int static_test(int a, int b); int main(int argc, char* argv[]) { int a = 3; int b = 4; printf("Hello: a + b = %d\n", static_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 -lDynLibrary -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 `static_test‘ 1> collect2: ld returned 1 exit status ========== 生成: 成功 0 个,失败 1 个,最新 2 个,跳过 0 个 ==========
1.5 添加链接库
在ConsoleApplication的链接器选项中添加库目录:
由于Linux下的动态库并不需要同名的.lib之类的静态库,因此这里的路径直接指向.so所在的路径,这里的路径可以使用相对于工程文件所在目录的相对路径,也可以使用绝对路径,但必须保证这个路径可以在Linux下访问。还需要注意大小写!
这里的每一个路径都对应于一个gcc的-L参数。
接着在ConsoleApplication的链接器选项中添加StaticLibrary的引用:
这里的附加依赖项可以填上.a文件的名字,但不需要加扩展名,也不需要lib前缀,每一个名字之间用分号分隔,它们的名字加上-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 -lStaticLibrary -L../bin/Linux/Debug/ 1> ConsoleApplication1.vcxproj -> F:\projects\tmp\ConsoleApplication1\ConsoleApplication1\..\bin\Linux\Debug\ConsoleApplication1 ========== 生成: 成功 1 个,失败 0 个,最新 2 个,跳过 0 个 ==========
1.6 调试
将ConsoleApplication设置为启动项目,在main函数设置断点,F5启动调试,一切正常。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。