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. 在Linux终端中查看公有IP的方法详解

    首先回顾一下一般的查看IP的命令: ifconfigLinux查看IP地址的命令--ifconfigifconfig命令用于查看和更改网络接口的地址和参数 $ifconfig -a  lo0: fla ...

  2. pom.xml里使用了一系列的版本的框架,配置一个版本属性,让使用版本的都引用这个属性

    在pom.xml定义properties标签 <properties> <project.build.sourceEncoding>UTF-8</project.buil ...

  3. 在Java项目中部署使用Memcached[转]

    在项目中使用到Memcached主要的目的是,通过缓存数据库查询结果,减少数据库访问次数,从而提高动态.数据库驱动网站的速度.提高可扩展性.Memcached是一个高性能的分布式内存对象缓存系统,基于 ...

  4. What's the difference between using “let” and “var” to declare a variable in JavaScript?

    https://stackoverflow.com/questions/762011/whats-the-difference-between-using-let-and-var-to-declare ...

  5. 用外部物理路由器时使用Neutron dhcp-agent提供的metadata服务(by quqi99)

    作者:张华  发表于:2015-12-29版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 环境搭 ...

  6. PostgreSQL的日志文件介绍

    PostgreSQL的日志文件 pg_log:数据库活动日志(也就是数据库的操作日志): pg_xlog:事务日志: pg_clog:事务状态日志(pg_clog是pg_xlog的辅助日志). 现在主 ...

  7. BZOJ 2111 [ZJOI2010]Perm 排列计数:Tree dp + Lucas定理

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意: 给定n,p,问你有多少个1到n的排列P,对于任意整数i∈[2,n]满足P[i ...

  8. 开启 cmd cmder 代理

    win10安装了ShadowSocks软件,浏览器通过代理后就可以***,但有时候需要通过cmd科学下载安装一些组件,就需要设置一下cmd的代理 cmd如果要设置代理的话,需要在执行其他命令之前,先执 ...

  9. poj3189二分图多重匹配

    题意:有一些牛和牛棚(有容量),每头牛对牛棚有喜好程度,要求每头牛都有一个棚子的情况下,找最小的喜好程度之差 题解:题意是真的恶心,wa了好久才发现没读懂,一直以为输入 的是排名,其实是牛棚标号,从1 ...

  10. 剑指Offer-翻转单词顺序

    题目描述: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符串的顺序不变.例如输入字符串:"I am a student",则输出"student a am I&qu ...