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[80];
    getcwd(buf, sizeof(buf));
    std::ofstream f;
    f.open("/home/reskai/work.txt");
    if (f)
    {
        f << buf;
        f << "\r\n";

        while (argc-- > 0)
        {
            f << *argv++ << "\r\n";
        }

        f.close();
    }
    return 0;
}

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”,这次终于通过链接了。

虽然终于成功用vs在linux下静态链接了自己写的库,但是这个解决方法吧,有点不伦不类的。不知道到底是vs2017的BUG还是我对linux的编译链接体系不太清楚。

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

题外话,就是因为这个问题让我之前一天到凌晨4点才睡着,第二天上了一天班,晚上又想这个问题到现在这个点才解决。

时间: 2024-08-03 03:00:20

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

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

最近在学习cocos2dx的过程中需要和服务器进行交互,所以这几天在学习libpomelo静态库的编译和使用.之前在windows系统下编译libpomelo,并在VS中引入比较顺利:但是,目前对Mac系统和XCode不是很熟悉,所以多花了些时间.不过,最终还是成功了,在这里就将我编译引入libpomelo静态库的过程记录下来,也分享给和我一样遇到问题的朋友们. 准备工作 libpomelo下载地址:https://github.com/NetEase/libpomelo或者http://pan

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

android ndk-build 编译静态库libxx.a 需求场景: 目前有安卓编码好的现在的openssl的两个.a,我们需要调用openssl的函数,并把功能再封装成.a; 这样使用时,在android studio jni项目 cmake 里面,需要先引用openssl的.a再引用 上面封装的.a; 如果使用so,那么,直接在android studio jni项目的 cpp里面直接调用openssl的方法,对外提供jni java接口,打包成so即可: 先来说用ndk-build 打

编译Linux使用的.a库文件

首先是须要编译成.a的源文件 hello.h: #ifndef __INCLUDE_HELLO_H__ #define __INCLUDE_HELLO_H__ void hello(const char *name); #endif // end __INCLUDE_HELLO_H__ hello.c #include "stdio.h" void hello(const char *name) { printf("Hello world %s\n", name);

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

复制粘贴大法一向是程序猿的利器,但有时也会引发一些拎不清的麻烦关系来.比如我们现在想新建一个项目,为了快速而对原来的uis-gateway动用了复制粘贴大法,然后改改项目名就成了uis-application了.这时你会发现如下图所示,sources root依然是uis-gateway: 怎么办?说来也简单,快捷键Ctrl+Alt+Shift+S打开Project Structure -> 在Modules中点下原始项目uis-gateway,我们看到这时它的Sources.Test.Reso

cmake windows 生成的目标静态库 会自动添加一个Debug 目录 [ 工具平台

http://baozoumanhua.com/users/17227716/talkingshttp://baozoumanhua.com/users/17227716/following_articleshttp://baozoumanhua.com/users/17227716/articleshttp://baozoumanhua.com/users/17227776http://baozoumanhua.com/users/17227776/forum_articleshttp://b

错误 NETSDK1007 找不到“E:\Project\MyProject\MyProject.Common\MyProject.Utility.csproj”的项目信息。这可以指示缺少一个项目引用。 MyProject.Data C:\Program Files\dotnet\sdk\2.2.107\Sdks\Microsoft.NET.Sdk\targets\Microsof

因为对MyProject.Data引用的项目MyProject.Common进行了重命名为MyProject.Utility,导致这个错误 解决办法: 1.找到MyProject.Data中的E:\Project\MyProject\MyProject.Data\obj\project.assets.json文件,然后把里面的MyProject.Common替换为MyProject.Utility,保存 2.删除MyProject.Utility项目下\obj\Debug.\bin\Debug下

在iOS中创建静态库

如果你作为iOS开发者已经有一段时间,可能会有一套属于自己的类和工具函数,它们在你的大多数项目中被重用. 重用代码的最简单方法是简单的 拷贝/粘贴 源文件.然而,这种方法很快就会成为维护时的噩梦.因为每个app都有自己的一份代码副本,你很难在修复bug或者升级时保证所有副本的同步. 这就是静态库要拯救你的.一个静态库是若干个类,函数,定义和资源的包装,你可以将其打包并很容易的在项目之间共享. 在本教程中,你将用两种方法亲手创建你自己的通用静态库. 为了获得最佳效果,你应该熟悉Objective-

linux上静态库和动态库的编译和使用(附外部符号错误浅谈)

主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考<Linux程序设计> 1. 静态库也被称为归档文件(archive,因此创建命令是ar),编译器和链接器负责将程序代码和静态库结合在一起组成单独的可执行文件: 但是缺点是许多应用程序同时运行并使用来自同一个静态库的函数时,内存中就会有一个函数的多份副本,而且程序文件自身也有多份同样的副本,这将消

Linux下Gcc生成和使用静态库和动态库详解

参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同