VS编译linux项目生成静态库并在另一个项目中静态链接的方法
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项目生成静态库并在另一个项目中静态链接的方法的更多相关文章
- Mac下编译libpomelo静态库,并在cocos2dx项目中引用
最近在学习cocos2dx的过程中需要和服务器进行交互,所以这几天在学习libpomelo静态库的编译和使用.之前在windows系统下编译libpomelo,并在VS中引入比较顺利:但是,目前对Ma ...
- 编译Linux使用的.a库文件
编译Linux使用的.a库文件 首先是须要编译成.a的源文件 hello.h: #ifndef __INCLUDE_HELLO_H__ #define __INCLUDE_HELLO_H__ void ...
- iOS静态库.a总结(2017.1.24增加脚本打包方法)
修改于:2017.1.24 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.根据源代码的公开情况,库可以分为2种类型 a.开源库 公开源代码,能看到具体实现 ,比如SDWebImag ...
- android ndk-build 编译静态库libxx.a 以及Android studio openssl 静态库配置(cmake)
android ndk-build 编译静态库libxx.a 需求场景: 目前有安卓编码好的现在的openssl的两个.a,我们需要调用openssl的函数,并把功能再封装成.a; 这样使用时,在an ...
- linux下生成动态库和链接动态库
1.生成动态库 src/test.h #ifndef _TEST_H_HH #define _TEST_H_HH void print(); #endif src/test.cpp #include ...
- 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃
我的这个是MJRefresh,学习打.a包Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ...
- iOS 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃
我的这个是MJRefresh,学习打.a包Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ...
- 复制粘贴引发的鸠占鹊巢——IDEA复制项目导致sources root复用了另一个项目
复制粘贴大法一向是程序猿的利器,但有时也会引发一些拎不清的麻烦关系来.比如我们现在想新建一个项目,为了快速而对原来的uis-gateway动用了复制粘贴大法,然后改改项目名就成了uis-applica ...
- angluarjs2项目生成内容合并到asp.net mvc4项目中一起发布
应用场景 angular2(下文中标注位NG2)项目和.net mvc项目分别开发,前期采用跨域访问进行并行开发,后期只需要将NG2项目的生产版本合并到.net项目. NG2项目概述 ng2项目采用的 ...
随机推荐
- Pandas标记删除重复记录
Pandas提供了duplicated.Index.duplicated.drop_duplicates函数来标记及删除重复记录 duplicated函数用于标记Series中的值.DataFrame ...
- linux下firefox显示中文乱码的问题
只需要yum install "@Chinese Support" 然后注销,再登录一下,刷新浏览器就可以正常显示中文了,当然前提是浏览器的字符编码为utf-8以及默认显示中文,这 ...
- jsonp 实现跨域例子
直接上代码: js: <html> <head> <title>JSONP</title> </head> <script src = ...
- QT 创建主窗口 MainWindow 实例
1. 2. mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include & ...
- POJ2741 Colored Cubes
Description There are several colored cubes. All of them are of the same size but they may be colore ...
- Django中间件的总结
一.中间件 --中间件是一个轻量级.底层的插件系统,可以加入Django的请求和响应过程,修改Django的输入和输出 --每一个中间件组件是一个独立的Python类,可以定义下面方法中的一个和多个 ...
- DH04-开放封闭原则
模式简介 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 无论模块是多么封闭,都会存在一些无法对之封闭的变化.对设计的模块预估可能发生变化种类,然后构造抽象来隔离变化. 解决:创建抽象 ...
- 有关linux下redis overcommit_memory的问题,有需要的朋友可以参考下。
我在安装redis-4.0.6后,启动时出现一些问题,如下: :M Jan ::! Background save may fail under low memory condition. To fi ...
- EF切换到Mysql数据库,更改web.config
1)引用: MySql.Data.dll,MySql.Data.Entity.dll,MySql.Data.Entity.EF6.dll 2)添加: <system.data> <D ...
- Mysql5.7压缩版安装启动不了的问题
从mysql 官网下载了mysql-5.7.12-winx64.zip的文件.按步骤安装: 1.添加环境变量 操作如下: 1)右键单击我的电脑->属性->高级系统设置(高级 ...