动态编译库
① 怎么重新编译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