导航:首页 > 源码编译 > msys2编译的库有依赖怎么办

msys2编译的库有依赖怎么办

发布时间:2023-05-14 23:19:32

1. 我编译A静态库的时候依赖了B静态库,我编译的程序依赖A静态库和B静态库,这样B静态库是不是会有重复的部分

静态库在程序的链接阶段被复制到了程序中。
你用依赖这睁腊个词。
程序编译一般需经预处理、编译、汇编和链接几个步骤。
在链接步骤中,静斗租态库才会被复制。
因为静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系。
存在几个链接?
那么就几分拷贝。悉销滑

2. spec文件不写依赖的情况依然存在依赖库

由于很多东西需要保密,所以不放截图
rpm -qlp *.rpm 查看rpm包中携带的文件
ldd file 检测编译文件夹下的bin文件是否是bin文件带来带汪的依赖
vi /usr/lib/rpm/micro 编辑rpm的编译宏
找到455,456行,注释掉

重新编译,使用 rpm -qpR *.rpm 检测新生成的rpm是否带有依赖
如果问题未被解决,则在spec文件Requires下绝笑面加入一行 AutoReqProv: no 来规避掉二进制文件并行含带来的依赖

3. 怎样解决maven里编译时包的依赖有关问题

一、导出到默认目录 targed/dependency
从Maven项目中导出项目依赖的jar包:进入工程pom.xml 所在的目录下,执行如下命令

mvn dependency:-dependencies
或在eclipse中,选择项目的pom.xml文件,点击右键菜单中的Run As,见下图红框中,在弹出的Configuration窗口中,输入 dependency:-dependencies后,点击运行
maven项目所依赖的jar包会导出到targed/dependency目录中。
二、导出到自定义目录中
在maven项目下创建lib文件夹,输入以下命令:

mvn dependency:-dependencies -DoutputDirectory=lib
maven项目所依赖的jar包都会复制到项目目录下的lib目录下
三、设置依赖级别
同时可以设置依赖级别,通常使用compile级别

mvn dependency:-dependencies -DoutputDirectory=lib -DincludeScope=compile

4. 如何自动解决rpmbuild编译时出现的依赖问题

这只能说明一个问题,你依赖的库本隐基销身有问题,没有把它的依锋档赖都加进去,也就是你例子中的①灶游libb.so依赖liba.so;,你应该在生成libb.so的时候,把对liba.so的依赖加进去,这样应该就没有问题了。

5. 安装32位库 lib32stdc++6提示依赖关系怎么办

检查下系统兼容问题,有的abaqus版本与档闭32位系统不兼容,今年好几个同事都出现这种问题,我给重装64位系统后就好了。建议你安装64位系统,内存为4G以上,要是32位系统的话,4G内存只显示携李不到3G,以后做动力计算时,2G内存算不了,只能打行隐裂开计算结果。

6. 6.2、android Studio 添加编译依赖

文章摘要
1、 三种依赖类型
2、库依赖关系配置
3、远程仓库
4、查看依赖关系树

英文文献

Android Studio中的摇篮构建系统可以很容易地包括外部的二进制文件或其他库模块到您的构建与依赖。该依赖性可以位于您的计算机上或远程仓库中,他们宣布任何传递依赖将自动包括在内。

要添加一个依赖于你的项目,指定诸如依赖配置compile在dependencies您的块build.gradle文件。

例如,下面build.gradle为应用模块文件包括三种不同类型的依赖关系:

每个这些要求不同类型的依赖关系如下:

此声明一有依赖性 的Android库模块 名为“在MyLibrary”(此名称必须定义为库名称相匹配include你的 settings.gradle 文件)。它需要构建系统编译库模块与应用模块,并在您的APK所产生的AAR文件。

由于Gradle读取相对路径的build.gradle 文件,这告诉构建系统添加您的项目内的所有JAR文件 mole_name/libs/的目录的依赖。
或者,您可以指定单独的文件如下:

这实际上是以下简写:

这宣告了“应用程序魔”库的12.3版本的依赖,在“code.example.android”命名空间组内。

内侧dependencies块,可以声明使用几种不同的一个库依赖依赖关系配置(诸如compile上面示出)。每个相关配置提供了摇篮有关如何使用图书馆不同的指令。下面的列表描述了每个可使用在你的Android项目库依赖的配置。

以上配置适用于项目的主要来源集,它适用于所有的构建变种。
如果你不是想声明的依赖只有特定的 构建变量 源设置或更改一个 测试源设置 ,你必须利用配置名称以及与构建变量或测试源集的名称前缀它。

例如,在添加compile
依赖关系只为您的“免费”产品的风味(使用远程二进制依赖),它看起来像这样:

但是,如果你想添加一个依赖于结合了产品的风味变体和构建类型,那么你必须初始化的配置名称configurations块。下面的示例增加了一个apk依赖于你的“freeDebug”打造变种(使用本地二进制依赖):

要添加compile为本地测试和仪表测试的依赖性,它看起来像这样:

如果你的 库模块提供了多个变种 ,你可以添加不同的库变体像这样不同的应用程序变量:

当你的依赖比当地的图书馆或文件树以外的东西,摇篮会在哪个在线存储库中指定的文件 repositories的块build.gradle文件。

默认情况下,新的Android Studio项目申报JCenter作为该项目的顶级存储库位置build.gradle的文件,如下图所示:

如果你想从Maven的中央仓库的东西,然后再添加 mavenCentral(),或本地存储库使用mavenLocal():

参考配置:

有些直接依赖可能有自己的依赖。这些被称为 传递依赖 。而不是要求您手动声明每个传递依赖,摇篮自动收集,并增加了它们。为了形象化两个项目的直接和传递依赖,对于摇篮的Android插件提供了生成依赖关系树为每个摇篮任务 构建变量 和 测试源集合 。

要生成此报告,步骤如下:

下面的示例报告显示调试构建变量的依赖关系树,包括前面例子中的本地库模块依赖和远程依赖性。

7. linux编译一个动态库,将所依赖的其他库的头文件包含了进来,但没指定其他静态库的路径和名称

编弊帆译能过。因为头文件的声明,表示在某个地方这野饥些租脊雹变量被定义了。既然被定义了,当然编译能过。但是如果没有那些库,链接是不能过的。

8. Windows搭建MSYS2和MINGW64环境

为了在windows下编译GDAL和Cesium Terrain Builder等软件,需要搭建MSYS2和MINGW64的编译环境

Windows Server 2012 R2
MSYS2 64位

双击安装MSYS2之后,由于MSYS2默认资源站点速度较慢,可以配置国内 清华大学开源镜像站裤镇
安装完成后,编辑 /etc/pacman.d/mirrorlist.mingw32 ,在文件开头添加:

编辑 /etc/pacman.d/mirrorlist.mingw64 ,在文件开头添加:

编辑 /etc/pacman.d/mirrorlist.msys ,在文件开头添加:

然后执行 pacman -Sy 刷新软件包数据即可。
配置国内镜像站点后液纯好,在shell里面执行 pacman -Syuu 更新全部依赖

MSYS2内置了pacman包管理工具,运行
pacman -S gcc make
即可安装gcc,make等工具

msys2安装完成后,开始菜单会有三个启动方式:

三种启动方式区别主要在于编译环境软件包的不同,如gcc,clang等版本不同。通用的工具如:grep,git,vim,emacs等等在三种方式内都是一样的。

默认情况下, msys64/home 会作为系统默闹铅认home目录,如果需要修改home目录,可在环境变量-》用户变量中建立 Home 变量,指向自定义位置,然后修改 msys64/etc/nsswitch.conf ,设置 db_home: /%Home%

9. C# 工程 DLLimport 导入的库若是有依赖库怎么办

第一步,我先从简单的调用出发,定义了一个简单的函数,该函数仅仅实现一个整数加法求和:

LIBEXPORT_API int mySum(int a,int b){ return a+b;}
C# 导入定义:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern int mySum (int a,int b);
}
在C#中调用测试:

int iSum = RefComm.mySum(,);

运答仔行查看结果iSum为5,调清信汪用正确。第一步试验完成,说明在C#中能够调用自定义的动态链接库函数。

第二步,我定义了字符串操作的函数(简单起见,还是采用前面的函数名),返回结果为字符串:

LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a); return a;}
C# 导入定义:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, string b);
}
在C#中调用测试:

string strDest="";
string strTmp= RefComm.mySum("45", strDest);

运坦空行查看结果 strTmp 为"45",但是strDest为空。我修改动态链接库实现,返回结果为串b:

LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a) return b;}
修改 C# 导入定义,将串b修改为ref方式:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中再调用测试:

string strDest="";
string strTmp= RefComm.mySum("45", ref strDest);
运行查看结果 strTmp 和 strDest 均不对,含不可见字符。再修改 C# 导入定义,将CharSet从Auto修改为Ansi:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, string b);
}
在C#中再调用测试:

string strDest="";
string strTmp= RefComm. mySum("45", ref strDest);
运行查看结果 strTmp 为"45",但是串 strDest 没有赋值。第二步实现函数返回串,但是在函数出口参数中没能进行输出。再次修改 C# 导入定义,将串b修改为引用(ref):

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}

运行时调用失败,不能继续执行。

第三步,修改动态链接库实现,将b修改为双重指针:

LIBEXPORT_API char *mySum(char *a,char **b){sprintf((*b),"%s",a); return *b;}
C#导入定义:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中调用测试:

string strDest="";
string strTmp= RefComm. mySum("45", ref strDest);

运行查看结果 strTmp 和 strDest 均为"45",调用正确。第三步实现了函数出口参数正确输出结果。

第四步,修改动态链接库实现,实现整数参数的输出:

LIBEXPORT_API int mySum(int a,int b,int *c){ *c=a+b; return *c;}
C#导入的定义:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern int mySum (int a, int b,ref int c);
}
在C#中调用测试:

int c=0;
int iSum= RefComm. mySum(,, ref c);

运行查看结果iSum 和c均为5,调用正确。

经过以上几个步骤的试验,基本掌握了如何定义动态库函数以及如何在 C# 定义导入,有此基础,很快我实现了变长加密函数在 C# 中的调用,至此目标实现。

三、结论

在 C# 中调用 C++ 编写的动态链接库函数,如果需要出口参数输出,则需要使用指针,对于字符串,则需要使用双重指针,对于 C# 的导入定义,则需要使用引用(ref)定义。

对于函数返回值,C# 导入定义和 C++ 动态库函数声明定义需要保持一致,否则会出现函数调用失败。定义导入时,一定注意 CharSet 和 CallingConvention 参数,否则导致调用失败或结果异常。运行时,动态链接库放在 C# 程序的目录下即可,我这里是一个 C# 的动态链接库,两个动态链接库就在同一个目录下运行。

10. 求助,依赖的动态库包含静态库,编译报错说找

动态链接库和静态链接库一般是编译集成一系列的接口(函数)
在程序源代码编译完成后通过编译器编译并通过链接器与这些库进行链接
动态链接库与静态链接库的区别在于链接器在进行链接时静态库会被直接编译进程序里
而动态链接库并不会,我们这里将这些链接库称作依赖(动态库和静态库)
程序的运行需要这些依赖,程序在静态链接后该程序本身便已包含该依赖
而动态链接后的程序本身本不包含该依赖,这些依赖需要执行者自行安装进操作系统(动态库、运行时库)
程序运行时会动态地加载这些库

linux上动态库一般的后缀后为.so
静态库一般的后缀为.a
由于静态链接会直接将库编译进程序里所以静态编译后的程序相较于动态链接所要大
这就是因为静态链接会将链接库编译进程序里的原因,所以占用就要大了
出于这种原因,静态库不易于维护与更新,如果链接库中有实现有bug等需要更新则需要更新整个程序,因为静态库被编译进程序中了
但动态库就没有这种情况了,因为动态库是程序运行时动态加载的,所以我们只需要更新动态库而不需要更新所有依赖该库的程序(软件)

另一方面,很多程序的开发都会使用到相同的链接库,也就是很多程序(软件)会有相同的依赖
如果将这些依赖全部静态编译的话将会造成存储资源占用过多而造成资源浪费
而使用动态库的方式这些程序(软件)则可以共享一个链接库,而不需要每个程序都带一个链接库,这样就大大地减少了存储资源占用空间

阅读全文

与msys2编译的库有依赖怎么办相关的资料

热点内容
非科班程序员自学 浏览:799
压缩泡沫鞋底底材 浏览:217
程序员职场第一课2正确的沟通 浏览:677
遇到不合法app应该怎么办 浏览:90
汇编程序编译后的文件 浏览:77
大智慧均线源码 浏览:371
单片机排阻的作用 浏览:213
滴滴金融app被下架如何还款 浏览:210
jpg转换成pdf免费软件 浏览:741
范里安pdf 浏览:443
伪造pdf 浏览:75
能删除android文件夹吗 浏览:446
LINUX使用V2ray 浏览:797
找人帮忙注册app推广是什么 浏览:820
独立服务器如何恢复初始化 浏览:11
优秀到不能被忽视pdf 浏览:316
导游程序员家政 浏览:586
22乘28的快速算法 浏览:338
软通动力程序员节2021 浏览:846
安卓系统如何卸载安装包 浏览:870