精华内容
下载资源
问答
  • 访问测试项目路径localhost:8080/hello 后台抛出异常:This application has no explicit mapping for /error, so you are seeing this as a fallback. 抛出此异常表示访问的页面url没有匹配到对应的值,原因有如下...

    访问测试项目路径localhost:8080/hello 后台抛出异常:This application has no explicit mapping for /error, so you are seeing this as a fallback.

    抛出此异常表示访问的页面url没有匹配到对应的值,原因有如下三点:

    • Application启动类的位置不对:要将Application类放在最外侧,即包含所有子包 ,spring-boot会自动加载启动类所在包下及其子包下的所有组件。如下图所示:

                               

    • springboot的配置文件有误:关于application.yml或application.properties文件中视图解析器的配置问题。在pom文件下的spring-boot-starter-paren版本较高时使用以下配置:spring.mvc.view.prefix/spring.mvc.view.suffix,当pom文件下的spring-boot-starter-paren版本较低时使用以下配置:spring.view.prefix/spring.view.suffix。
    • 控制器的url访问路径与注解@GetMapping("/xxxx")不匹配,如下图所示:

    展开全文
  • 1. 只能生成一个 so库,不能一次性生成多个 so库,之前的mk是可以有子模块的。 2. 每次生成的so所在的目录不是在 jniLibs下,虽然知道如果打包,会将它打包进去,但就是觉得看不见它,想提供给别人用,还要去某个...

    ##前文

    注意:此文的所有配置都是mac电脑下
    一直想用Android Studio的新方式Cmake来编译JNI 代码,之前也尝试过,奈何有两个难题挡住了我

    1. 只能生成一个 so库,不能一次性生成多个 so库,之前的mk是可以有子模块的。
    2. 每次生成的so所在的目录不是在 jniLibs下,虽然知道如果打包,会将它打包进去,但就是觉得看不见它,想提供给别人用,还要去某个目录找。

    经过尝试,这两个问题都可以解决了。

    2020年1月6号补充

    如果Android工程有第三方so库,并且jni编译后使用下面的cmake指定输出目录到 jniLibs下,有可能会发生 so库重复的错误。
    请采用以下方法避免错误:

    android {
     			..........
     		packagingOptions {
            	//解决AS BUG. 优先选择JNILIBS下的so库
            	pickFirst 'lib/arm64-v8a/libDriver.so'
            	pickFirst 'lib/armeabi/libDriver.so'
            	pickFirst 'lib/armeabi-v7a/libDriver.so'
       		}
    }
    

    生成单个so的案例

    demo下载地址: http://download.csdn.net/detail/b2259909/9766081

    直接看CMakeLists.txt文件:

    #指定需要CMAKE的最小版本
    cmake_minimum_required(VERSION 3.4.1)
    
    
    #C 的编译选项是 CMAKE_C_FLAGS
    # 指定编译参数,可选
    SET(CMAKE_CXX_FLAGS "-Wno-error=format-security -Wno-error=pointer-sign")
    
    #设置生成的so动态库最后输出的路径
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
    
    #设置头文件搜索路径(和此txt同个路径的头文件无需设置),可选
    #INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/common)
    
    #指定用到的系统库或者NDK库或者第三方库的搜索路径,可选。
    #LINK_DIRECTORIES(/usr/local/lib)
    
    
    add_library( native-lib
                 SHARED
                 src/main/cpp/native-lib.cpp )
    
    target_link_libraries( native-lib
                           log )
    

    其中 各个设置都有说明。主要看这个:

    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
    

    它将会把生成的so库按照你在 build.gradle 指定的 abi分别放置在 jniLibs下
    描述

    非常好,先解决了第二个问题了。


    生成多个so案例

    还是上面那个demo,重新建一个module。

    cpp的目录结构:

    这里写图片描述


    直接看CMakeLists.txt文件:

    #指定需要CMAKE的最小版本
    cmake_minimum_required(VERSION 3.4.1)
    
    
    #C 的编译选项是 CMAKE_C_FLAGS
    # 指定编译参数,可选
    SET(CMAKE_CXX_FLAGS "-Wno-error=format-security -Wno-error=pointer-sign")
    
    #设置生成的so动态库最后输出的路径
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
    
    #设置头文件搜索路径(和此txt同个路径的头文件无需设置),可选
    #INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/common)
    
    #指定用到的系统库或者NDK库或者第三方库的搜索路径,可选。
    #LINK_DIRECTORIES(/usr/local/lib)
    
    
    #添加子目录,将会调用子目录中的CMakeLists.txt
    ADD_SUBDIRECTORY(one)
    ADD_SUBDIRECTORY(two)
    

    不同的地方是改为添加子目录:

    #添加子目录,将会调用子目录中的CMakeLists.txt
    ADD_SUBDIRECTORY(one)
    ADD_SUBDIRECTORY(two)
    

    这样就会先去跑到子目录下的 one 和 two 的CmakeLists.txt,执行成功再返回。
    此时子目录one下的CmakeLists.txt:

    #继承上一层的CMakeLists.txt的变量,也可以在这里重新赋值
    #C 的编译选项是 CMAKE_C_FLAGS
    # 指定编译参数,可选
    #SET(CMAKE_CXX_FLAGS "-Wno-error=format-security -Wno-error=pointer-sign")
    
    #生成so动态库
    ADD_LIBRARY(one-lib SHARED one.cpp)
    
    target_link_libraries(one-lib log)
    

    子目录two下的CmakeLists.txt:

    #继承上一层的CMakeLists.txt的变量,也可以在这里重新赋值
    #C 的编译选项是 CMAKE_C_FLAGS
    # 指定编译参数,可选
    #SET(CMAKE_CXX_FLAGS "-Wno-error=format-security -Wno-error=pointer-sign")
    
    #生成so动态库
    ADD_LIBRARY(two-lib SHARED two.cpp)
    
    target_link_libraries(two-lib log)
    

    最后生成了以下两个so文件,并自动按照abi分别放置在了 jniLibs下:

    这里写图片描述

    第一个问题也成功了。

    总结

    最后,除了 设定abiFilters 必须在 build.gradle
    主要是发现CmakeLists.txt里 其实可以指定很多东西:

    1. so输出路径 CMAKE_LIBRARY_OUTPUT_DIRECTORY
    2. .a 静态库输出路径 CMAKE_ARCHIVE_OUTPUT_DIRECTORY
    3. 获取当前编译的abi , ANDROID_ABI
    4. 编译选项:
      CMAKE_C_FLAGS
      CMAKE_CXX_FLAGS
      CMAKE_CXX_FLAGS_DEBUG/CMAKE_CXX_FLAGS_RELEASE
    5. 子目录编译: ADD_SUBDIRECTORY
    6. #设置.c文件集合的变量
    #当前cmakelists.txt所在目录的所有.c .cpp源文件
    AUX_SOURCE_DIRECTORY(. SRC_LIST)
    
    #增加其他目录的源文件到集合变量中
    list(APPEND SRC_LIST
            ../common/1.c
            ../common/2.c
            ../common/3.c
            ../common/4.c
            ../common/5.c
            ../common/WriteLog.c
        )
    
    #生成so库,直接使用变量代表那些.c文件集合
    add_library(mylib SHARED ${SRC_LIST})
    

    6._执行自定义命令:

    # copy头文件到 静态库相同文件夹下
    add_custom_command(TARGET myjni
      PRE_BUILD
      COMMAND echo "executing a copy command"
      COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/myjni.h ${PROJECT_SOURCE_DIR}/../../../build/outputs/staticLib/myjni/${ANDROID_ABI}
      COMMENT "PRE_BUILD, so This command will be executed before building target myjni"
     )
    

    最后,因为很多时候,JNI的参数还要转为C的方式,当我们在JAVA层写了native方法,android IDE自动提示红色,这时按下 ALT + ENTER 可以自动生成JNI下的方法声明,并且入参也帮我们转换好了。不过有时候这个插件不生效。

    所以我写了一个JNI 的入参转为 C/C++的代码插件: JNI-Convert-Var,直接在 plugin 的仓库搜就有了。
    最近尝试实现android studio的ALT + ENTER 可以自动生成JNI下的方法声明,结果发现好多IntelliJ IDEA的接口不熟悉。 只能先放弃了,以下是我的逻辑:

    当鼠标点击在 Native声明方法上时:

    1. 检查文件类型,如果为java就继续
    2. 获取当前行的上下共三行字符串数据,使用正则表达式获取native声明的完整方法。
    3. 检查当前模块目录下的jni或者cpp目录下的.c或者.cpp文件。
    4. 如果没有文件,弹窗让用户创建一个C/C++文件,并追加转换后(如何转换会有一个专门的类)的Java2C方法在文件末尾. 在IDE打开此文件。
    5. 如果JNI或者cpp目录有一个以上的C/C++文件, 弹窗让用户选择一个C/C++文件或者创建,之后打开文件追加转换后(如何转换会有一个专门的类)的Java2C方法在文件末尾. 。 在IDE打开此文件。

    上面逻辑中:

    1. 文件类型 ,IntelliJ IDEA 的plugin开发API中可以获取到
    2. 获取当前行的上下共三行字符串数据 ,IntelliJ IDEA 的plugin开发API中可以获取到
    3. 模块目录的API暂时没找到
    4. 在IDE打开C/C++文件,不知道用什么接口
    展开全文
  • 安装cuda时可能有下面的信息 Installing the CUDA Toolkit in /usr/local/cuda-8.0 ... Missing recommended library: libGLU.so Missing recommended library: libX11.so Missing recommended library: libXi.so

    安装cuda时可能有下面的信息

    Installing the CUDA Toolkit in /usr/local/cuda-8.0 …
    Missing recommended library: libGLU.so
    Missing recommended library: libX11.so
    Missing recommended library: libXi.so
    Missing recommended library: libXmu.so

    原因是缺少相关的依赖库,安装相应库就解决了:

    sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev 

    再次安装,就不再提示了

    $sudo ./cuda_8.0.61_375.26_linux.run

    Do you accept the previously read EULA?
    accept/decline/quit: accept

    Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 375.26?
    (y)es/(n)o/(q)uit: n

    Install the CUDA 8.0 Toolkit?
    (y)es/(n)o/(q)uit: y

    Enter Toolkit Location
    [ default is /usr/local/cuda-8.0 ]:

    Do you want to install a symbolic link at /usr/local/cuda?
    (y)es/(n)o/(q)uit: y

    Install the CUDA 8.0 Samples?
    (y)es/(n)o/(q)uit: y

    Enter CUDA Samples Location
    [ default is /home/guyadong ]:

    Installing the CUDA Toolkit in /usr/local/cuda-8.0 …
    Installing the CUDA Samples in /home/guyadong …
    Copying samples to /home/guyadong/NVIDIA_CUDA-8.0_Samples now…
    Finished copying samples.

    ===========

    = Summary =

    Driver: Not Selected
    Toolkit: Installed in /usr/local/cuda-8.0
    Samples: Installed in /home/guyadong
    Please make sure that
    - PATH includes /usr/local/cuda-8.0/bin
    - LD_LIBRARY_PATH includes /usr/local/cuda-8.0/lib64, or, add /usr/local/cuda-8.0/lib64 to /etc/ld.so.conf and run ldconfig as root

    To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-8.0/bin

    Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-8.0/doc/pdf for detailed information on setting up CUDA.

    ***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 361.00 is required for CUDA 8.0 functionality to work.
    To install the driver using this installer, run the following command, replacing with the name of this run file:
    sudo .run -silent -driver

    Logfile is /tmp/cuda_install_13101.log
    Signal caught, cleaning up

    参考:

    《ubuntu14.04+cuda8.0(GTX1080)+caffe安装》

    展开全文
  • SO_SNDTIMEO和SO_RCVTIMEO

    万次阅读 2017-08-23 16:24:00
    SO_SNDTIMEO和SO_RCVTIMEO这两个套接字选项用来设置超时时间的,看代码吧。 [mapan@localhost sockOption]$ ls client.cpp makefile server.cpp [mapan@localhost sockOption]$ cat client.cpp #include #include ...

                   SO_SNDTIMEO和SO_RCVTIMEO这两个套接字选项用来设置超时时间的,看代码吧。

     

    [mapan@localhost sockOption]$ ls
    client.cpp  makefile  server.cpp
    [mapan@localhost sockOption]$ cat client.cpp 
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <errno.h>
    #include <malloc.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/ioctl.h>
    #include <stdarg.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <signal.h>
    #define MAXLINE 4096
    
    
    int main(int argc,char **argv)
    {
       int connfd,ret;
       char sendbuf[400000]={0};
       struct sockaddr_in servaddr;
    
       if(argc != 2)
       {
          printf("error\n");
       }
    
       connfd=socket(AF_INET,SOCK_STREAM,0);
       memset(&servaddr,0,sizeof(servaddr));
       servaddr.sin_family=AF_INET;
       servaddr.sin_port=htons(6666);
       inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
    
       connect(connfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
       
       struct timeval stTimeValStruct;
       stTimeValStruct.tv_sec=5;
       stTimeValStruct.tv_usec=0;
    
       setsockopt(connfd,SOL_SOCKET,SO_SNDTIMEO,&stTimeValStruct,sizeof(stTimeValStruct));
       while(1)
       {
         ret= write(connfd,sendbuf,sizeof(sendbuf));
         printf("ret=%d\n",ret);
       }
      
       close(connfd);
       return 0;
    }
    
    
    [mapan@localhost sockOption]$ cat server.cpp 
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <errno.h>
    #include <malloc.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/ioctl.h>
    #include <stdarg.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <signal.h>
    #define MAXLINE 4096
    
    
    int main()
    {
       int listenfd,acceptfd;
       struct sockaddr_in servaddr;
    
    
       listenfd=socket(AF_INET,SOCK_STREAM,0);
       memset(&servaddr,0,sizeof(servaddr));
       servaddr.sin_family=AF_INET;
       servaddr.sin_port=htons(6666);
       servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    
       bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
       listen(listenfd,10);
    
       acceptfd=accept(listenfd,(struct sockaddr *)NULL,NULL);   
        
       getchar();
       close(acceptfd);
       close(listenfd); 
       return 0;
    }
    
    [mapan@localhost sockOption]$ cat makefile 
    all:server client
    
    server.o:server.cpp
    	g++ -c server.cpp
    client.o:client.cpp
    	g++ -c client.cpp
    server:server.o
    	g++ -o server server.o
    client:client.o
    	g++ -o client client.o
    
    clean:
    	rm -f server client *.o
    [mapan@localhost sockOption]$ 

    编译并运行,客户端需要新打开一个窗口执行。

     

     

    [mapan@localhost sockOption]$ make
    g++ -c server.cpp
    g++ -o server server.o
    g++ -c client.cpp
    g++ -o client client.o
    [mapan@localhost sockOption]$ ./server 
    
    [mapan@localhost sockOption]$ ./client 127.0.0.1
    ret=400000
    ret=400000
    ret=400000
    ret=254012
    ret=-1
    ret=-1
    ^C
    [mapan@localhost sockOption]$ 

     

    再看看看接收缓冲区和发送缓冲区:

     

    [mapan@localhost ~]$ netstat -nap | grep 6666
    (Not all processes could be identified, non-owned process info
     will not be shown, you would have to be root to see it all.)
    tcp        0      0 0.0.0.0:6666                0.0.0.0:*                   LISTEN      6151/./server       
    tcp   138900      0 127.0.0.1:6666              127.0.0.1:59104             ESTABLISHED 6151/./server       
    tcp        0 1315113 127.0.0.1:59104             127.0.0.1:6666              FIN_WAIT1   -                   
    [mapan@localhost ~]$ 

     

     

     

    虽然我们没有获取到发送缓冲区的最大的上限值,但是发送缓冲区确实满了,write返回-1,证明write失败了。如果我们没有设置超时时间,write就会一直阻塞在那里。

    发送缓冲区为什么会满?你首先要懂得write是干嘛的,它可不是发送数据。write是将用户进程中的数据拷贝到发送缓冲区中,如果发送缓冲区满了,write就会返回-1。发送数据是跟write没有关系的,那是协议做的事。由netstat可以看到对端接收缓冲区有数据,而且已经满了。所以数据堆积在发送缓冲区发不出去,导致发送缓冲区满了。

    我们设置超时时间为5秒,write会阻塞在那里5秒,然后返回。



     

    参考资料:unix网络编程卷一

     

     

    展开全文
  • Java调用so文件

    万次阅读 热门讨论 2019-02-14 11:39:06
    公司的硬件让我帮忙调用一个so文件,想着一直都没机会自己写一个jni,于是就答应了,在调用的过程中还踩了不少坑,特地写一篇博客记录一下。 一、使用技术 原本是想直接用java自带的jni,但是我们硬件只给了一个so...
  • Android apk中so库文件未压缩

    万次阅读 2020-03-05 17:59:12
    查看apk包,发现apk 包中so库文件未被压缩. 但是一个类似项目,相同版本却没有问题 升级前 升级后 升级后Raw File Size 正好是未压缩的大小 可能原因 不同版本AGP gradle build task 实现不一样, 再某情况下回不进行...
  • .so .so.1区别

    千次阅读 2019-05-11 15:06:35
    细深的先不讲,我只知道使用.so时是gcc main.c-ltest 使用.so.1时是gcc main.c test.so.1
  • libxxx.so- text relocations问题的终极解决方案

    万次阅读 多人点赞 2017-04-02 20:34:42
    问题表现形式错误或警告日志当targetSdkVersion>=23且使用debug签名时,在6.0+的... E/linker: /data/app/packagename/lib/arm/libxxx.so: has text relocations W/System.err: java.lang.UnsatisfiedLinkError:
  • 在开发openwrt时,编译内核的时候,自己写的代码在openwrt 编译报错,提示缺少依赖库文件 Package Gateway_Auto is missing dependencies for the following libraries: ...libc.so.6 libm.so.6 libpthread.so.0 ...
  • 文章目录情况一:自己电脑里有库情况二:自己电脑里搜不到库ibmysqlclient.so.18ibmysqlclient.so.20和ibmysqlclient.so 我在编译C语言MySQL程序时不成功,然后我查看了以前的执行文件 ldd ./a.out 结果少了三个库 ...
  • 为什么你需要重点关注so文件 App中可能出错的地方 其他地方也可能出错 使用android-21平台版本编译的so文件运行在android-15的设备上 混合使用不同C运行时编译的so文件 没有为每个支持的CPU架构提供对应的so文件 将...
  • frida so Hook 动态获取so地址

    千次阅读 2019-05-21 09:19:57
    # -*- coding: UTF-8 -*- import frida, sys jsCode = """ Java.perform(function(){ Process.enumerateModules({ onMatch: function(exp){ if(exp.name == 'libhello.so'){ ...
  • SO_SNDBUF和SO_RCVBUF

    千次阅读 2018-04-24 21:08:12
    SO_SNDBUF:TCP发送缓冲区的容量上限; SO_RCVBUF:TCP接受缓冲区的容量上限; 注意:缓冲区的上限不能无限大,如果超过内核设置的上限值,则以内核设置值为准(sysctl -a命令查看)。 ...
  • 因为so库放入jar之后,so就不是一个独立的.so文件了,用System.load()加载就会提示找不到这个库,所以要想加载这个so 就需要把so 从jar 中提取出来,保存为临时文件,然后再加载。但是不能直接提取.so文件,需要把....
  • SO_SNDBUF and SO_RECVBUF

    千次阅读 2014-08-27 15:35:14
    参见 http://stackoverflow.com/questions/4257410/what-are-so-sndbuf-and-so-recvbuf ...The "SO_" prefix is for "socket option", so yes, these are per-socket settings for the per-socket buffers. There ar
  • 在使用CUDA的过程中,常会遇到以下问题:Error: libcudart.so.9.0: cannot open shared object file: No such file or directory // 或者 Error: libcusolver.so.9.0: cannot open shared object file: No such file...
  • vscode 编译so库,并且引用so库调试

    千次阅读 2019-08-29 13:30:04
    本周就IDE选择、cpp程序编译、so库引用、jni编译方面走了一遍,从C++程序编写、编译调试,引用so库走了一遍,基本还好,没碰到什么难点! 1. IDE选择VsCode,只要下载几个插件就可以进行开发了: 2.在Vscode 中...
  • 一、当前工程的.so文件和生成该.so文件的工程代码不一致,当前.so文件中不包含工程代码中的某些函数。例如我的工程代码中有NdarrytoImage()这个函数,但是我使用的.so生成时却没有该函数,则在编译的时候不包含...
  • Android so文件浅析

    万次阅读 2018-05-19 17:50:30
    Android中的so文件是动态链接库,是二进制文件,即ELF文件。多用于NDK开发中。 二. 基础知识 三. so文件格式解析 so文件即ELF文件,是一个二进制文件,我们可以用UltraEdit打开查看。如下: 上面有一处很...
  • Android libdvm.so 与 libart.so

    万次阅读 2015-03-31 15:33:44
    Android libdvm.so 与 libart.so 系统升级到5.1之后,发现system/lib/下面没有libdvm.so了,只剩下了libart.so。对于libart模式,从4.4就在Developer optins里面就可以手动选择,到5.1算是转正了。 1,...
  • 设置套接字超时的第三个技术是使用套接字选项 SO_RCVTIMEO 与 SO_SNDTIMEO,它的优势在于一次设置,所有应用于该套接字的操作都自动带有超时时间。它就好像是一个全局开关。比如对于 SO_RCVTIMEO 来说,如果设置了它...
  • SOT-23、SOT-223封装的三极管、MOS管

    千次阅读 2020-01-07 13:29:30
    SOT-23、SOT-223封装的三极管、MOS管 SOT-23 三极管 无论是PNP还是NPN,1脚为基极,2脚为发射极,3脚为集电极。 MOS 管 无论是P沟道还是N沟道,1脚为栅极,2脚为源极,3脚为漏极。 SOT-223 三极管 无论是PNP还是...
  • 在Linux下整合.so库到java工程中的过程中,使用JNA遇到加载不到so的问题。现在总结一下: 1.在Linux下,IDEA中。.so的库只会识别在/target/classes/路径下。因此手动直接将.so放到此处就可以识别。 (注意到没有,这...
  • 我在阿里云的ECS使用docker运行tensorflow的时候,当import tensorflow是提示无法加载 libnvinfer.so.6 libnvinfer_plugin.so.6的错误信息。 2020-02-25 09:24:32.442272: W tensorflow/stream_executor/platform/...
  • linux 应用程序application中动态加载 libA.so, 而libA.so调用了libB.so中的函数funcB();application运行时出现undefined symbol: funcB用ldd -r application,发现确实没有加载动态链接库libB.so。用-lB编译选项,...
  • Centos7安装opencv-python缺少共享库(libSM.so.6, libXrender.so.1, libXext.so.6)的解决办法 今天在服务器上安装opencv-python时,前后报了如下缺少共享库的错误 ImportError: libSM.so.6: cannot open shared ...
  • linux 什么是SO文件

    万次阅读 多人点赞 2018-11-23 16:15:28
    so其实就是shared object的意思。今天看了上面的博客,感觉好吃力。赶紧做个笔记记录一下。下面的内容大多都是连接中的,穿插我自己的笔记   牵扯到ELF格式,gcc编译选项待补,简单实用的说明一下,对Linux下的so...
  • Golang调用so文件示例

    千次阅读 2020-04-01 15:39:27
    test_so.h int test_so_func(int a,int b); test_so.c #include "test_so.h" int test_so_func(int a,int b) { return a*b; } 生成so gcc -shared ./test_so.c -o test_so.so 复制so文件到Go项目目录 Go项目...
  • setsockopt中SO_RCVTIMEO和SO_SNDTIMEO

    千次阅读 2015-08-26 14:49:04
    SO_RCVTIMEO和SO_SNDTIMEO套接口选项可以给套接口的读和写,来设置超时时间, 一、在unix网络编程中,说是他们只能用于读和写,而像 accept和connect都不能用他们来设置. 可是我在阅读内核源码的过程中看到,在linux中,...
  • 今天遇到一个需求,需要把项目中的诸多的so封装成一个aar,直接使用这个aar进行调用,因为诸多的so看起来太多了,不太好管理,封装成一个aar也变相的达到了加密的效果。 文章目录打包aar流程第一步的重点就是:新建...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,263,853
精华内容 505,541
关键字:

so