VS2017也推出很久了,在单位的时候写linux的服务端程序只能用vim,这让用惯了IDE的我很难受。

加上想自己撸一套linux上的轮子,决定用VS开工远程编写调试linux程序。

在windows下编写静态库并在另一个项目中引用很简单

新建项目的时候选择静态库,进去把代码撸好,即可编译出静态库*.lib

随后在希望使用该静态库的项目中设置一下链接器“附加库目录”为"../Debug"(和你的输出路径有关),然后添加"附加依赖项"静态库名.lib",然后就可以顺利的编译静态库了。

但是在linux下这件事却让我头疼了几天,我一开始也准备按照windows下的套路来解决,解决在新建项目的时候压根没看到静态库这一选项……

不过还好在常规里面找到了“配置类型”选项,设置成“静态库(.a)”就可以了。

在准备使用静态库的时候,真正的麻烦来了,一开始我按照windwos下的思路,当前项目链接时的工作目录就是解决方案的路径,所以按照编译出来的文件结构写下了“附加库目录”(../common/bin/x64/Debug),然后去填写“附加依赖项”(“libcommon.a”),编译的时候就华丽丽的出错了,提示没有这个文件……

后来尝试过吧“libcommon.a”改成““common””、“附加库目录”直接指定成linux上的绝对地址等方案,但是很可惜没有任何一个方案可以。

在linux下自己写参数指定绝对地址能够顺利将静态库链接成功,但是用vs的环境却总是失败,这个时候有点让我怀疑人生了。

甚至一度想用VS写好代码然后去linux下写MAKEFILE,手动编译。但是转念一想,这岂不是回到远古时代了?不行,我得干掉这个问题。

后来突发奇想,写了一个小程序myhelp,放进了usr/bin/中

int main(int argc,char **argv)
{
char buf[];
getcwd(buf, sizeof(buf));
std::ofstream f;
f.open("/home/reskai/work.txt");
if (f)
{
f << buf;
f << "\r\n"; while (argc-- > )
{
f << *argv++ << "\r\n";
} f.close();
}
return ;
}

myhelp用来获取当前的工作目录,以及将调用的参数全部输出到文件当中。

随后更改项目的链接器,用myhelp替换掉g++来当链接器,得到了一些有意思的信息

/home/reskai
myhelp
-o
/home/reskai/projects/projectK/bin/x64/Debug/projectK.out
-Wl,--no-undefined
-Wl,-L../common/bin/x64/Debug
-Wl,-z,relro
-Wl,-z,now
-Wl,-z,noexecstack
/home/reskai/projects/projectK/obj/x64/Debug/main.o
libcommon.a

在远程调用linux的时候,当前的工作目录不是项目路径而是~/……恩……就是这个我想当然的原因导致我一直没能够成功编译

然后我就去改了“附加库目录”,设置到了正确的位置,随后重新链接……我再次怀疑人生,仍然无法找到文件。(其实这个时候应该想到的,之前我设置附加库目录为绝对地址仍然无法链接说明了这个选项还是有bug的)

最后没有办法的情况下,我试着将“附加库目录”给删除了,然后在"附加依赖项"中直接填入完整的静态库路径“./projects/common/bin/x64/Debug/libcommon.a”,这次终于通过链接了。

用此文记录下我遇到的这个问题与思考方法以及最终的解决方案。

都过了半年了……不过找到了一个完美的解决方案,顺手来记录一下吧

链接器-常规-附加库目录 里面填上完整静态库的目录,因为默认工作目录是~,所以填         ./projects/outBin/staticLib/

然后链接器-输入-库依赖项 里面一行填一个静态库的名称。

因为我生成了两个静态库libnetX64D.a libcommonX64D.a,其中net库依赖common,common又依赖的pthread,所以填入

netX64D
commonX64D
pthread

必须一行一行的填……VS傻傻的给每一行前面加上一个-l

VS编译linux项目生成静态库并在另一个项目中静态链接的方法的更多相关文章

  1. Mac下编译libpomelo静态库,并在cocos2dx项目中引用

    最近在学习cocos2dx的过程中需要和服务器进行交互,所以这几天在学习libpomelo静态库的编译和使用.之前在windows系统下编译libpomelo,并在VS中引入比较顺利:但是,目前对Ma ...

  2. 编译Linux使用的.a库文件

    编译Linux使用的.a库文件 首先是须要编译成.a的源文件 hello.h: #ifndef __INCLUDE_HELLO_H__ #define __INCLUDE_HELLO_H__ void ...

  3. iOS静态库.a总结(2017.1.24增加脚本打包方法)

    修改于:2017.1.24 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.根据源代码的公开情况,库可以分为2种类型 a.开源库 公开源代码,能看到具体实现 ,比如SDWebImag ...

  4. android ndk-build 编译静态库libxx.a 以及Android studio openssl 静态库配置(cmake)

    android ndk-build 编译静态库libxx.a 需求场景: 目前有安卓编码好的现在的openssl的两个.a,我们需要调用openssl的函数,并把功能再封装成.a; 这样使用时,在an ...

  5. linux下生成动态库和链接动态库

    1.生成动态库 src/test.h #ifndef _TEST_H_HH #define _TEST_H_HH void print(); #endif src/test.cpp #include ...

  6. 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃

    我的这个是MJRefresh,学习打.a包Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ...

  7. iOS 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃

    我的这个是MJRefresh,学习打.a包Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ...

  8. 复制粘贴引发的鸠占鹊巢——IDEA复制项目导致sources root复用了另一个项目

    复制粘贴大法一向是程序猿的利器,但有时也会引发一些拎不清的麻烦关系来.比如我们现在想新建一个项目,为了快速而对原来的uis-gateway动用了复制粘贴大法,然后改改项目名就成了uis-applica ...

  9. angluarjs2项目生成内容合并到asp.net mvc4项目中一起发布

    应用场景 angular2(下文中标注位NG2)项目和.net mvc项目分别开发,前期采用跨域访问进行并行开发,后期只需要将NG2项目的生产版本合并到.net项目. NG2项目概述 ng2项目采用的 ...

随机推荐

  1. Tomcat8内置jdk8运行环境发布web项目

    简单说明:之前部署项目都是没有改变之前的环境变量,最近由于公司的数据源换了,jdk由1.7改成了1.8,tomcat7也改为了1.8,现在需要部署采用新数据源的这个项目, 为了不改变之前的环境变量,使 ...

  2. Go HelloWorld 网络版和并发版

    网络版 package main import ( "net/http" "fmt" ) func main() { http.HandleFunc(" ...

  3. Request对象介绍(客户端到服务器)

    1.处理请求和响应的过程request,response,关于request可以从三个方面着手学习.1:如何获取请求头  行  体   2:请求中文处理     3:请求对象的其它常用方法 1.1:r ...

  4. 【bzoj1318】[Spoj744] Longest Permutation(乱搞)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1318 这道题的大意是要求一个长度为len,并包含1~len所有数,并使len最大的子区 ...

  5. 运行tomcat,报错:Socket bind failed: [730048] ?????????×???(Э?é/???????/???)????í??错误

    运行tomcat时,报错: Socket bind failed: [730048] ?????????×???(Э?é/???????/???)????í??错误 原因分析: 这是因为之前已开启了一 ...

  6. Http协议与生命周期

    一.Http知识:    1.基于socket        浏览器(格式一)        web服务器(格式一)        MYSQL客户端(格式二)        MYSQL服务端(格式三) ...

  7. Java中的算术运算符

    算术运算符主要用于进行基本的算术运算,如加法.减法.乘法.除法等. Java 中常用的算术运算符: 其中,++ 和 -- 既可以出现在操作数的左边,也可以出现在右边,但结果是不同滴 例1: 运行结果: ...

  8. Python OS导入一个文件夹所有文件

    import os path = 'F:/save_file/seminarseries/' for root, dirs, files in os.walk(path): print(root) 这 ...

  9. zeptojs的一些别人的博客

    http://www.css88.com/doc/zeptojs/ http://blog.163.com/litianyichuanqi@126/blog/static/11597944120142 ...

  10. MVC3 ajax功能

    微软mvc3框架的项目使用微软自带的ajax 必须引用下面 <script src="/Scripts/jquery.unobtrusive-ajax.js" type=&q ...