当前位置:首页 » 编程软件 » 动态编译库

动态编译库

发布时间: 2023-05-13 06:39:15

① 怎么重新编译android 下面的动态库

使用动态库来编译动态库

A项目的android.mk文件如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := testa
LOCAL_SRC_FILES := testa.c
include $(BUILD_SHARED_LIBRARY)

生成的libtesta.so加入到E:\workspace\android-ndk-r8e\platforms\android-8\arch-arm\usr\lib\下面

项目B的文件目录结构如下:
jni
jni/jni/
jni/prebuilt/
jni目录下的mk文件如下:
include $(all-subdir-makefiles)

jni/prebuilt目录下的mk文件如下:
LOCAL_PATH := $(call my-dir)

#include $(CLEAR_VARS)
LOCAL_MODULE := libtesta
LOCAL_SRC_FILES := libtesta.so
include $(PREBUILT_SHARED_LIBRARY)

同时把libtesta.so也放入该目录下.

jni/jni目录下的mk文件内容:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS := -ltesta

LOCAL_MODULE := testb
LOCAL_SRC_FILES := testb.c

include $(BUILD_SHARED_LIBRARY)

这样生成libtestb.so文件, 同时eclipse在打包时会把libtesta.so, libtestb.so都加入到apk文件中,如果没有prebuilt那一步,那么在打包时会漏掉libtesta.so, 但编译会通过,因为编译读取的是编译系统的库文件目录(LOCAL_LDLIBS := -ltesta), 这点需要注意
java代码:
System.loadLibrary("testa");

System.loadLibrary("testb");

注意先后关系

② 编译时找不到动态库

报错:

分析:
  应该是动态库链接的库位置不对,默认在目录usr/lib/ 下查找动态库。

方式一 用ln -s建立创建软连接,确保/usr/lib下存在库。
  ln -s /绝对路径/源 /绝对路径/目的
方式二 编译时使用-rpath 或者-rpath-link,例如如下gcc编译时设置
mips64el-redhat-linux-gcc -o test *.c -Wall -L./lib/mips64le/ -lpthread -lm -Wl,-rpath=/usr/local/gcc-4.8.3-d197-n64-loongson/usr/mips64el-redhat-linux/lib64/

挂载命令的顺序

③ C#代码编译动态链接库(DLL)

1.visual studio 新建-项目-类库

2.一定要选.NET FrameWork

4.配置名字芹简路径

或者引用-添加引用

windows路径:桐知
C:\Program Files\Unity\Hub\Editor<version-number>\Editor\Data\Managed\UnityEngine
macOS路局首消径:
/Applications/Unity/Hub/Editor/<version-number>/Unity.app/Contents/Managed/UnityEngine

10.添加引用完成后【生成】/【重新生成】

11.生成后的文件在刚才选的路径/默认路径

④ linux编译动态库未定义main函数

Linux编译动态库时出现未定义main函数的问题,很可能是因为编译器默认把森数敏源文件作为可执行程序进行编译。一个毕槐解决方法是指定编译参数-fPIC (position independent code),它使编译器生成与位置无关的可重定位目标文件;另一种方法是在编译时加上-lpthread参数以解决链接库中使用到的线程库未找到的问题。当然,还有其他可能导致该问题此枝的原因,比如代码中使用的头文件没有正确包含等,需要进一步排查。

⑤ 动态库会跟着程序编译吗

不会,动态库是独立的模块,可以被多个程序共享。在编译时,程序会链接动态库,但不会跟着编译,而是通过关联模块加载后再执行程序。因此,动态库只需要编译一次就可以被多个程慧喊序使用,效前告野率比静态库友弊更高。

⑥ Cmake动态编译VTK库(QVtkwidget)

在版本问题上大费周章之后,得到如下的成功尝试

软件版本说明:

PCl1.8.1 + VS2017 + Qt5.9.6 + Cmake + Vtk8.0.0

点击Configure后对条目进行处理:(修改完成继续Configure直到没有错误)

1.点击Add Entry添加 

    Name:    CMAKE_DEBUG_POSTFIX 、Type:    STRING 、Value:-gd、Description:空

让vtk的lib最后分为debug版本跟release版本。Debug版本带-gd。Release版本不带-gd,方便区分.

2.勾选BUILD_SHARED_LIBS,这样最后生成的vtk才会有dll跟lib

3.CMAKE_INSTALL_PREFIX设置为你清空的VTK文件夹(为了方便,这里选择的路径为PCL集成的VTK路径)

4.勾选VTK_Group_Qt,这样以后方便在qt里面使用

5.修改Qt5_DIR路径为PATH=D:/Qt/Qt5.12.0/5.12.0/msvc2017_64/lib/cmake/Qt5

6.修改VTK_QT_VERSION:STRING=5,使用Qt5修改相应版本号

7.如出现qmake路径则修改QT_QMAKE_EXECUTABLE:FILEPATH=D:/Qt/Qt5.12.0/5.12.0/msvc2017_64/bin/qmake.exe

完成Configure,不出意外就不再显示红色,接着点Generate

接着以管理员身份运行VS2017,打开构建目录下的VTK.sln

选择Debug,x64,然后右键解决方案窗口的ALL_BUILD --> 生成。

 漫长等待...ing

然后右键install --> 仅生成install

Release版本同理,先ALL_BUILD --> 生成 再 右键install --> 仅生成install

至此完成编译VTK操作,接下来提取所需的QVtkwidget插件

⑦ qt动态库编译,是否只要声明

qt动态库编译,是否只要声明
这里的动态的意思汪耐应该是模块代码是动态加载的
而不是随着应用程序一起编译
只要动态库里的函数接口不变
应用程序就无需重新编译
只键橘需将动态库重新编译后替换掉旧的动态库即可
如果动态库的函数接口困亮春有变动
那么应用程序就要重新编译发布
这也是我的个人理解~~~

⑧ 动态库怎么编译

# 声称动代连接库模山销,假设名唯轮称为libtest.so gcc x.c y.c z.c -fPIC -shared -o libtest.so # 将main.c和动态连接库进行连接生成可执行文件 gcc main.c -L. -ltest -o main # 输出LD_LIBRARY_PATH环境变量,一边动态库装载旦游器能够找到需要的动态库 e...

⑨ 动态库编译详解

当前类介绍:upper.c ( upper) 依赖于 bottom.c(play)

说明:当执行可执行程序的时候,需要去/lib. /user/lib下和LD_LIBRARY_PATH下寻找so.并不会在当前目录下寻找.

所以执行./main.out会报错.如下:

解决方案:指定.so运行搜寻路径

1.-Wl,-rpath ./mypath 加入参数,并且将libplay.so 到./mypath目录下.

2.设置LD_LIBRARY_PATH,指定目录.

说明:指定了-Wl,-rpath, 设置LD_LIBRARY_PATH也是可以生效的.并不是说只会去-Wl,-rpath下寻找.

首先生成一个bottom.so,然后用upper.so去依赖bottom.so, 然后main.c 再去依赖upper.so.

说明:这里编译的时候直接出错,是因为没有指定搜寻路径,所以无法通过编译.

解决编译问题方案.

1.我们依然采用LD_LIBRARY_PATH的方式可以解决编译和运行的问题.

2.生成libplay的时候,直接指定-Wl,-rpath 给libbottom.可以解决编译不通过的问题.

3.依赖所有库

依赖所有库只能解决编译问题,无法处理运行的路径.

另一种思路:我们在执行main.out的时候 执行-Wl,-rpath.并不在生成libplay的时候指定,看下是否正常.

由此可见,-Wl,-rpath 只能针对直接依赖的libplay.so指定了路径,但是libbottom还是无法查找到 .但是LD_LIBRARY是可以的.

rpath只能对直接依赖的so设置搜寻目录,并且可以设置所有依赖的编译路径.

总结: 解决编译问题,在生成libplay的时候指定-Wl,-rpath运行路径,或者设置LD_LIBRARAY_PATH,都可以解决这个问题.

当我们现在拥有的so包含一个直接依赖的so和很多间接依赖的so,但是没有设置rpath.所以是不能直接依赖主so进行编译和运行的.

为了通过编译:

1.在只链接主so的情况下可以去设置rpath或者LD_LIBRARY_PATH.

2.或者链接所有so.

为了通过运行:

为了正常运行可以设置LD_LIBRARY_PATH.

--disable-new-dtags,---dt-needed-entries

结论概述:

1.我们在生成间接依赖的库的时候,为了保证其他库可以直接依赖,需要加入-Wl,-rpath.保证编译通过.

2.LD_LIBRARY_PATH可以解决一切编译运行问题.

⑩ 为什么动态编译Qt库需要Perl环境

您最初的想法是正确的,x86平台的库放在电脑上即可。

而通过arm-linux-交叉编译工具链编译过的库,是需要放在
开发板的文件系统里面的,通用的做法一般是放在/lib或者/usr/lib
目录里面即可。或者也可放在其他目录中,但是需要配置一下LD_LIBRARY_PATH
环境变量。例如放在/home/qtlib目录中,由于这个不是系统默认的动态库目录,

需要设置环境变量LD_LIBRARY_PATH,在/etc/profile下面添加:
export LD_LIBRARY_PATH=/home/qtlib:$LD_LIBRARY_PATH

热点内容
sqlserver导出mdf 发布:2025-07-10 19:52:55 浏览:669
安卓应用怎么样安装电脑 发布:2025-07-10 19:51:16 浏览:188
java修改文件时间 发布:2025-07-10 19:50:30 浏览:989
ftp需要重新配置 发布:2025-07-10 19:42:25 浏览:776
加密兔官网地址 发布:2025-07-10 19:32:38 浏览:350
广州win10电脑服务器托管 发布:2025-07-10 19:16:09 浏览:678
疫苗的存储与运输 发布:2025-07-10 19:11:54 浏览:90
安卓原相机怎么p白皮 发布:2025-07-10 19:10:24 浏览:525
编译原理词法的等价描述形式有 发布:2025-07-10 19:10:09 浏览:375
twrp哪个版本支持安卓11 发布:2025-07-10 18:59:22 浏览:849